Поддерживают ли регулярные выражения Python из модуля re границы слов (b)?


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

>>> x = 'one two three'
>>> y = re.search("btwob", x)

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

- это b выражение не поддерживается в Python или я неправильно ее используете?

4 67

4 ответа:

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

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>
>>> 

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

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

"\b"

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

r"\b"

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

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

\b

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

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

print("foo\bbar")
fobar

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

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