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






Для этого используйте функцию re.escape():
escape(string)
Return string with all non-alphanumerics backslashed; this is useful if you want to match an arbitrary literal string that may have regular expression metacharacters in it.
Упрощенный пример, поиск любого вхождения предоставленной строки, необязательно сопровождаемой 's', и возврат объекта соответствия.
def simplistic_plural(word, text):
word_or_plural = re.escape(word) + 's?'
return re.match(word_or_plural, text)
Вы можете использовать re.escape ():
re.escape(string) Return string with all non-alphanumerics backslashed; this is useful if you want to match an arbitrary literal string that may have regular expression metacharacters in it.
>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'
Если вы используете версию Python <3.7, это позволит избежать не буквенно-цифровых символов, которые также являются частью синтаксиса регулярных выражений нет.
Если вы используете версию Python <3.7, но> = 3.3, это позволит избежать не буквенно-цифровых символов, которые являются частью синтаксиса регулярных выражений нет, а Кроме - специально для подчеркивания (_).
К сожалению, re.escape() не подходит для замены строки:
>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'
Решение состоит в том, чтобы поместить замену в лямбду:
>>> re.sub('a', lambda _: '_', 'aa')
'__'
потому что возвращаемое значение лямбды обрабатывается re.sub() как буквальная строка.
@tripleee Это неверно, аргумент repl не является простой строкой, он разбирается. Например, re.sub(r'(.)', r'\1', 'X') вернет X, а не \1.
Вот соответствующий вопрос для выхода из аргумента repl: stackoverflow.com/q/49943270/247696
Изменено в версии 3.3: символ «_» больше не экранирован. Изменено в версии 3.7: Экранируются только символы, которые могут иметь особое значение в регулярном выражении. (Почему так долго?)
Пожалуйста, попробуйте:
\ Q и \ E как якоря
Поместите условие Или, чтобы оно соответствовало полному слову или регулярному выражению.
Ссылка: Как сопоставить целое слово, содержащее специальные символы в регулярном выражении
Аргумент
replдляre.sub- это строка, а не регулярное выражение; Применять к немуre.escapeвообще не имеет смысла.