Некоторые из оставшихся метасимволов, являются утверждениями нулевой ширины. Они не заставляют движок регулярных выражений продвигаться по строке. Они вообще не сравниваются с символами, они просто сообщают движку регулярных выражений о присутствии данного условия в строке или терпят неудачу.
Например \b
- это утверждение, что текущая позиция находится на границе слова. Позиция не изменяется с помощью \b
вообще. Это означает, что утверждения нулевой ширины никогда не должны повторяться, потому что если они совпадают один раз в данном месте, следовательно они могут быть сопоставлены бесконечное число раз.
'|'
:Метасимвол '|'
обозначает чередование, или оператор or
. Если A
и B
являются регулярными выражениями, то выражение A | B
будет соответствовать любой строке, которая соответствует либо A
, либо B
. Метасимвол '|'
имеет очень низкий приоритет, когда чередуются многосимвольные строки. Выражение Crow|Servo
будет соответствовать или Crow
или Servo
.
Чтобы сопоставить литерал '|'
, используйте \|
или заключите его в символьный класс, как [|]
.
'^'
:Метасимвол '^'
- обозначает совпадение с началом строки. Если флаг re.MULTILINE
не установлен, он будет совпадать только с началом строки. В MULTILINE
режиме '^'
также совпадает сразу после каждой новой строки в строке.
Например, если сопоставить слово From
только в начале строки, используйте шаблон ^From
.
>>> print(re.search('^From', 'From Here to Eternity')) # <_sre.SRE_Match object; span=(0, 4), match='From'> >>> print(re.search('^From', 'Reciting From Memory')) # None
'$'
:Метасимвол '$'
соответствует концу строки, который определяется как конец строки или любое место, за которым следует символ новой строки.
>>> print(re.search('}$', '{block}')) # <_sre.SRE_Match object; span=(6, 7), match='}'> >>> print(re.search('}$', '{block} ')) # None >>> print(re.search('}$', '{block}\n')) # <_sre.SRE_Match object; span=(6, 7), match='}'>
Чтобы сопоставить литерал '$'
, используйте конструкцию \$
или заключите его в класс символов, как [$]
.
'\A'
:Метасимвол '\A'
обозначает обозначает совпадение только с началом строки. Когда режим MULTILINE
выключен '\A'
и '^'
фактически одинаковы. В многострочном режиме они различны: '\A'
по- прежнему совпадает только в начале строки, а '^'
может совпадать в любом месте внутри строки, которая следует за символом новой строки \n
.
'\Z'
:Совпадает только c концом строки.
'\b'
:Метасимвол '\b'
обозначает границу слова. Это утверждение с нулевой шириной, которое соответствует только началу или концу слова. Слово определяется как последовательность буквенно-цифровых символов, поэтому конец слова обозначается пробелом или не буквенно-цифровым символом.
Следующий пример соответствует набору букв class
только тогда, когда это полное слово. Оно не будет совпадать, если набор букв class
содержится внутри другого слова.
>>> p = re.compile(r'\bclass\b') >>> print(p.search('no class at all')) # <_sre.SRE_Match object; span=(3, 8), match='class'> >>> print(p.search('the declassified algorithm')) # None >>> print(p.search('one subclass is')) # None
Есть две тонкости, которые должны помнить при использовании этой специальной последовательности. Во-первых, это худшее столкновение между строковыми литералами Python и последовательностями регулярных выражений. В строковых литералах Python \b
это символ backspace
- значение ASCII 8. Если не использовать необработанные строки, то Python преобразует \b в backspace
и регулярное выражение не будет соответствовать ожидаемому. Следующий пример выглядит так же, как предыдущий RrgExp, но не использует 'r' перед строкой шаблона.
>>> p = re.compile('\bclass\b') >>> print(p.search('no class at all')) # None >>> print(p.search('\b' + 'class' + '\b')) # <_sre.SRE_Match object; span=(0, 7), match='\x08class\x08'>
Во вторых, внутри символьного класса метасимвол '\b'
не используется, а представляет символ backspace
для совместимости со строковыми литералами Python.
'\B'
:Метасимвол '\B'
это противоположность '\b'
. Происходит сопоставление только когда текущая позиция движка не находится на границе слова.