Я работаю над функцией, которая переводит данный текст с заданными правилами.Неожиданное поведение регулярного выражения
def bork(text):
"""
Implementation of language transformation based on Swedish-Chef talk.
"""
rules = {"\be": "i",
"the": "zee",
"\Be\b": "e-a",
"an": "un"
}
rules = dict((re.escape(k), v) for k, v in rules.items())
pattern = re.compile("|".join(rules.keys()))
borked = pattern.sub(lambda i: rules[re.escape(i.group(0))], text.strip())
return borked
text = """experienced"""
print bork(text)
# gives "experienced"
Где оно должно указывать "ixperienced"
. Из-за правила \be: i
. Другие преобразования хорошо работают при тестировании с большим объемом ввода, но это не помогает, пожалуйста, помогите мне.
Редактировать: Я добавил правило "\Bi\B": "ee"
. Который должен сделать результат "ixpereeenced"
. Что тоже не сработало. Я все еще получаю "experienced"
.
Edit2: кажется, что проблема существует в рамках правил, которые я использовал обратную косую черту, однако, я попытался использовать сырые строки и re.escape()
. После этого я попытался удалить re.escape()
, но это дает мне ключ ошибки в словаре вызова. (Я также хочу, чтобы выяснить, почему это происходит)
Я попробовал, не помогло. – Rockybilly
Избавление от вызова re.escape() заставляет меня получить ключевую ошибку в этой ситуации. Может быть, если бы вы могли мне помочь, это могло бы решить мою проблему :( – Rockybilly
@Rockybilly Проблема в том, что согласованный текст не будет равен регулярному выражению, когда регулярное выражение содержит специальные конструкторы регулярных выражений, такие как '\ b'. По этой причине вы не можете index в словарь правил с совпадающим текстом – pasztorpisti