Escape [в регулярных выражениях Python - PullRequest
6 голосов
/ 05 августа 2010

Этот поиск reg exp правильно проверяет, содержит ли строка текст harry :

re.search(r'\bharry\b','[harry] blah',re.IGNORECASE)

Однако мне нужно убедиться, что строка содержит [harry].Я пытался убежать с разным количеством обратных косых черт:

re.search(r'\b\[harry\]\b','[harry] blah',re.IGNORECASE)
re.search(r'\b\\[harry\\]\b','[harry] blah',re.IGNORECASE)
re.search(r'\b\\\[harry\\\]\b','[harry] blah',re.IGNORECASE)

Ни одна из этих решений не нашла соответствия.Что мне нужно сделать?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 05 августа 2010

Первый правильный:

r'\b\[harry\]\b'

Но это не будет совпадать с [harry] blah, поскольку [ не является символом слова, и поэтому границы слова не существует. Он будет совпадать только в том случае, если перед [ стоит символ слова, как в foobar[harry] blah.

1 голос
/ 05 августа 2010
>>> re.search(r'\bharry\b','[harry] blah',re.IGNORECASE)
<_sre.SRE_Match object at 0x7f14d22df648>
>>> re.search(r'\b\[harry\]\b','[harry] blah',re.IGNORECASE)
>>> re.search(r'\[harry\]','[harry] blah',re.IGNORECASE)
<_sre.SRE_Match object at 0x7f14d22df6b0>
>>> re.search(r'\[harry\]','harry blah',re.IGNORECASE)

Проблема в \b, а не в скобках.Единственная обратная косая черта является правильной для выхода.

0 голосов
/ 05 августа 2010

Вы избегаете его так же, как и большинство метасимволов регулярных выражений: перед ним ставится обратный слеш.

Таким образом, r"\[harry\]" будет соответствовать буквенной строке [harry].

Проблема заключается в\b в вашем образце.Это якорь границы слова .

Совпадения \b:

  • В начале строки, если она начинается с символа слова
  • В конце строки, если она заканчивается символом слова
  • Между символом слова \w и несловесным символом \W (обратите внимание на разницу регистра)

Скобки [ и ] НЕ являются символами слова, поэтому, если строка начинается с [, слева от нее нет \b.В любом месте, где нет \b, вместо него \B (обратите внимание на различие в регистре).

Ссылки

  • регулярные-выражения.info / границы слов
  • http://docs.python.org/library/re.html

    \b: соответствует пустой строке, но только в начале или конце слова.Слово определяется как последовательность буквенно-цифровых символов или символов подчеркивания, поэтому конец слова обозначается пробелом или не алфавитно-цифровым символом, не подчеркиванием.Обратите внимание, что \b определяется как граница между \w и \W, поэтому точный набор символов, который считается буквенно-цифровым, зависит от значений флагов UNICODE и LOCALE.Внутри символьного диапазона \b представляет символ возврата, для совместимости со строковыми литералами Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...