Сообщить об ошибке.

Метасимволы нулевой ширины в RegExp Python

Метасимволы нулевой ширины в регулярном выражении

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

Например \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'. Происходит сопоставление только когда текущая позиция движка не находится на границе слова.