2015-07-02 2 views
2

Я разрабатываю приложение, где мне нужно искать и заменять строки в тексте.Функция распознавания регулярных выражений 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 специальных символов буквально.

+0

Кстати, если вам действительно нужен '\ b', тогда я думаю, вам нужно добавить скобки. Я не очень хорошо знаю Python; но во всех знакопеременных выражениях, которые я знаю, '|' является оператором с низким приоритетом, поэтому выражение выше будет эквивалентно '(?: \ bINT.) | ...'. Вы, вероятно, хотели '\ b (?: Int. | ...) \ b'. И если вы сделаете это изменение, вы, вероятно, не сможете просто написать 'r '\ b (?:' + ...', потому что '\ b (:' не является допустимым регулярным выражением, вам, возможно, придется писать ' r '\ b' + ('(:' + '|' .join (subs_dict.keys()). replace ('.', [.]) + ')') + r '\ b''. внесите изменения, предложенные thefourtheye, конечно. –

ответ

2

уборщик способом было бы избежать фактических строк, с re.escape, прежде чем присоединиться к ним, как этот

r'\b' + '|'.join(map(re.escape, subs_dict)) + r'\b' 

Например,

>>> import re 
>>> subs_dict = {"INT.": "Internet"} 
>>> def substitutions(text): 
...  return re.sub(r'\b' + '|'.join(map(re.escape, subs_dict)) + r'\b', 
...     lambda m: subs_dict[m.group(0)], text) 
... 
>>> substitutions("The INTREPID explorer") 
'The INTREPID explorer' 
>>> substitutions("The INT.EPID explorer") 
'The InternetEPID explorer' 
+0

О, спасибо, это кажется лучше. Одна из проблем, которые я до сих пор имею, имеет конечные пробелы. Например, где «The INT.EPID explorer» будет заменен «INT. EPID explorer "не будет. –

+0

Просто удалите' \ b's и попробуйте – thefourtheye

Смежные вопросы