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

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

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

Ответ 1

Используйте re.escape

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

Повторяя это здесь:

re.escape (строка)

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

Ответ 2

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

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

Важно отметить:

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

Ответ 3

Используйте функцию 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" :\\'

Ответ 4

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

>>> 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\" :\\

Ответ 5

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

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\" :\

Ответ 6

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

import re

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