Я разрабатываю приложение, где мне нужно искать и заменять строки в тексте.Функция распознавания регулярных выражений Python для оценки литералов-символов
Я столкнулся с this SO post и использовал третий ответ в качестве основы для моей функции.
Мой код выглядит следующим образом:
subs_dict = {
"INT.": "Internet",
...
}
def substitutions(self, text):
return re.sub(
r'\b' + '|'.join(subs_dict.keys())
+ r'\b', lambda m: subs_dict[m.group(0)],
text
)
Однако это получает споткнулся на текст такого как "The INTREPID explorer"
который терпит неудачу с Key Error
для INTR
.
Проблема в том, что в сравнении «INT». интерпретируется как «INT» и любой другой символ, поскольку период является особым.
я временно исправили проблему с помощью этого модифицированного кода: «[.] INT»
def substitutions(text):
return re.sub(
r'\b' + '|'.join(subs_dict.keys()).replace('.', [.])
+ r'\b', lambda m: subs_dict[m.group(0)],
text
)
который позволяет период должны быть оценены в буквальном смысле, но сохраняет целостность ключей Dict (в отличие от использования в качестве ключ, который будет не в состоянии.
Однако это имеет неприятный запах к нему, и, конечно, требует только уход за период, а не какие-либо другие специальные символы.
Итак, я предполагаю, что мой вопрос будет, если является лучшим способом, который работает и оценивает ny специальных символов буквально.
Кстати, если вам действительно нужен '\ b', тогда я думаю, вам нужно добавить скобки. Я не очень хорошо знаю Python; но во всех знакопеременных выражениях, которые я знаю, '|' является оператором с низким приоритетом, поэтому выражение выше будет эквивалентно '(?: \ bINT.) | ...'. Вы, вероятно, хотели '\ b (?: Int. | ...) \ b'. И если вы сделаете это изменение, вы, вероятно, не сможете просто написать 'r '\ b (?:' + ...', потому что '\ b (:' не является допустимым регулярным выражением, вам, возможно, придется писать ' r '\ b' + ('(:' + '|' .join (subs_dict.keys()). replace ('.', [.]) + ')') + r '\ b''. внесите изменения, предложенные thefourtheye, конечно. –