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

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

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

Ответы [ 6 ]

167 голосов
/ 17 ноября 2010

Использовать 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 (string)

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

17 голосов
/ 17 августа 2012

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

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

Важные вещи для заметки:

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

Используйте 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" :\\'
3 голосов
/ 01 августа 2013

Как уже упоминалось выше, ответ зависит от вашего случая. Если вы хотите экранировать строку для регулярного выражения, вам следует использовать 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\" :\\
2 голосов
/ 13 февраля 2015

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

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
2 голосов
/ 17 ноября 2010

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

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\" :\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...