Экранирование специальных символов регулярных выражений в строке Python


есть ли у Python функция, которую я могу использовать для экранирования специальных символов в регулярном выражении?

например, I'm "stuck" : должны стать I'm "stuck" :.

6 89

6 ответов:

использовать re.побег

re.escape(string)
>>> re.escape('\ a.*$')
'\\\ a\.\*\$'
>>> print(re.escape('\ a.*$'))
\\ a\.\*$
>>> re.escape('www.stackoverflow.com')
'www\.stackoverflow\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

см.:http://docs.python.org/library/re.html#module-contents

повторять его здесь:

re.escape (string)

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

Я удивлен, что никто не упоминал использование регулярных выражений через re.sub():

import re
print re.sub(r'([\"])',    r'\', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\', 'it\'s "this"')  # it\'s\ \"this\"

важные вещи, чтобы отметить:

  • на поиск узор, включают в себя \ а также характер(Ы), который вы ищете. Вы собираетесь использовать \ чтобы избежать ваших персонажей, так что вам нужно бежать это как хорошо.
  • поставить скобки поиск узор, например,([\"]), так что замена шаблон может использовать найденный символ, когда он добавляет \ перед ним. (Вот что does: использует значение первой группы в скобках.)
  • The r перед r'([\"])' это "сырые" строки. Необработанные строки используют разные правила для экранирования обратной косой черты. Писать ([\"]) как простая строка, вам нужно будет удвойте все обратные косые черты и напишите '([\"])'. Необработанные строки более дружелюбны, когда ты пишешь регулярно выражения.
  • на замена шаблон, вам нужно бежать \ чтобы отличить его от обратная косая черта, предшествующая группе подстановок, например , следовательно,r'\'. Писать это как простая строка, вам понадобится '\\\1' - и никто этого не хочет.

используйте repr () [1:-1]. В этом случае двойные кавычки не нужно экранировать. Срез [-1:1] - это удаление одинарной кавычки из начала и конца.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\

или, может быть, вы просто хотите, чтобы избежать фразу, чтобы вставить в вашу программу? Если да, то сделайте следующее:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\'

Как уже упоминалось выше, ответ зависит от вашего случая. Если вы хотите экранировать строку для регулярного выражения, то вы должны использовать re.бежать.)( Но если вы хотите избежать определенного набора символов, то используйте эту лямбда-функцию:

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\", ['"'])
I'm \"stuck\" :\

Это не так сложно:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\', '\'"' )
'I\\'m \"stuck\" :\'
>>> print( _ )
I\'m \"stuck\" :\

Если вы хотите только заменить некоторые символы, вы можете использовать это:

import re

print re.sub(r'([\.\\+\*\?\[\^\]$\(\)\{\}\!\<\>\|\:\-])', r'\', "example string.")