Экранирование строки регулярного выражения в Python

Я хочу использовать ввод от пользователя в виде шаблона регулярного выражения для поиска по некоторому тексту. Он работает, но как я могу обрабатывать случаи, когда пользователь помещает символы, имеющие смысл в регулярном выражении? Например, пользователь хочет выполнить поиск Word (s): двигатель regex примет (s) как группу. Я хочу, чтобы он рассматривал его как строку "(s)". Я могу запустить replace на пользовательский ввод и заменить ( на \( и ) на \), но проблема в том, что мне нужно будет заменить все возможные символы регулярных выражений. Вы знаете лучший способ?

Ответ 1

Используйте для этого функцию re.escape():

4.2.3 re Содержание модуля

побег (строка)

Возвращаемая строка со всеми неалфавитами обратной косой черты; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения в ней.

Простейший пример, поиск любого присутствия предоставленной строки, необязательно сопровождаемого 's', и возврат объекта соответствия.

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

Ответ 2

Вы можете использовать re.escape():

re.escape(строка)     Возвращаемая строка со всеми неалфавитными спицами; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения в ней.

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

Ответ 3

К сожалению, re.escape() не подходит для заменяющей строки:

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

Решение заключается в замене в лямбда:

>>> re.sub('a', lambda _: '_', 'aa')
'__'

потому что возвращаемое значение лямбда обрабатывается re.sub() как литеральная строка.