Поддерживают ли регулярные выражения Python из модуля re границы слов (\ b)? - PullRequest
86 голосов
/ 22 октября 2010

При попытке узнать немного больше о регулярных выражениях, в учебном пособии предлагалось использовать \b для сопоставления границы слова.Однако следующий фрагмент в интерпретаторе Python не работает должным образом:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

Это должен был быть объект сопоставления, если что-либо было сопоставлено, но это None.

1008 * выражение не поддерживается в Python или я его неправильно использую?

Ответы [ 4 ]

75 голосов
/ 22 октября 2010

Это будет работать: re.search(r"\btwo\b", x)

Когда вы пишете "\b" на Python, это один символ: "\x08". Либо избежать обратной косой черты, как это:

"\\b"

или напишите необработанную строку следующим образом:

r"\b"
74 голосов
/ 22 октября 2010

Почему бы вам не попробовать

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

Выход:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

Также забыл упомянуть, вы должны использовать необработанные строки в вашем коде

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 
12 голосов
/ 14 августа 2018

Просто чтобы явно объяснить , почему re.search("\btwo\b", x) не работает, это потому, что \b в строке Python является сокращением для символа возврата.

print("foo\bbar")
fobar

Таким образом, шаблон "\btwo\b" ищет backspace, затем two, за которым следует еще один backspace, которого нет в искомой строке (x = 'one two three').

Чтобы разрешить re.search (или compile) интерпретировать последовательность \b как границу слова, либо избегайте обратной косой черты ("\\btwo\\b"), либо используйте необработанную строку для создания шаблона (r"\btwo\b").

9 голосов

Документация Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

Соответствует пустой строке, но только в начале или концеслово.Слово определяется как последовательность буквенно-цифровых символов или символов подчеркивания, поэтому конец слова обозначается пробелом или не алфавитно-цифровым символом, не подчеркиванием.Обратите внимание, что формально, \ b определяется как граница между символами \ w и \ W (или наоборот) или между \ w и началом / концом строки, поэтому точный набор символов, который считается буквенно-цифровым, зависитна значениях флагов UNICODE и LOCALE.Например, r '\ bfoo \ b' соответствует 'foo', 'foo.', '(Foo)', 'bar foo baz', но не 'foobar' или 'foo3'.Внутри символьного диапазона \ b представляет символ возврата, для совместимости со строковыми литералами Python.

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