4.1 Повече метасимволи

Има още няколко метасимвола, които не сме обхванали досега. Повечето от тях ще бъдат разгледани в този раздел.

Някои от оставащите метасимволи, които ще дискутираме, са твърдения с нулев размер. Те изобщо не карат машината да напредне нататък в символния низ. Вместо да консумират символи, те просто успяват или се провалят. Например, \b е твърдение, че текущата позиция се намира на границата на една дума; позицията изобщо не се променя от \b. Това означава, че твърденията с нулев размер никога не бива да се повтарят, защото ако те веднъж паснат с дадено място, то очевидно ще могат да пасват безкрайно много пъти.

|
Дизюнкция, или оператор ``ИЛИ''. Ако A и B са регулярни изрази, A|B ще пасне с всеки символен низ, който пасва с "A" или "B". | има много нисък приоритет, за да може да работи приемливо когато го използвате с многосимволни низове. Crow|Servo ще съвпадне с "Crow" или "Servo", но не и със "Cro", "w", "S", или "ervo".

За да съвпаднете "|" буквално, или използвайте \|, или го затворете в рамките на клас от символи, ето така: [|].

^
Пасва в началото на редовете. Освен ако не е вдигнат флага MULTILINE, този метасимвол ще пасне само с началото на символния низ. В режим MULTILINE, той ще пасне точно след всеки символ за нов ред в рамките на символния низ.

Например, ако желаете да съвпаднете думата "From" само в началото на ред, използвайте РИ ^From.

>>> print re.search('^From', 'From Here to Eternity')
<re.MatchObject instance at 80c1520>
>>> print re.search('^From', 'Reciting From Memory')
None

За да съвпаднете "^" буквално, или използвайте \^, или го затворете в рамките на клас от символи, ето така: [\].

$
Пасва с края на редовете, т.е. или в края на символния низ, или след всеки символ за нов ред.

>>> print re.search('}$', '{block}')
<re.MatchObject instance at 80adfa8>
>>> print re.search('}$', '{block} ')
None
>>> print re.search('}$', '{block}\n')
<re.MatchObject instance at 80adfa8>
За да съвпаднете "$" буквално, или използвайте \$, или го затворете в рамките на клас от символи, ето така: [$].
\A
Пасва само с началото на символния низ. Когато режимът MULTILINE е изключен, \A и ^ на практика са едно и също. Обаче в режим MULTILINE се различават. Тогава \A все още пасва само с началото на символния низ, но ^ може да пасне на няколко места в символния низ (след всеки символ за нов ред).
\Z
Пасва само с края на символния низ.
\b
Граница на дума. Това е твърдение с нулев размер, което пасва само с началото или с края на някоя дума. Тъй като думата е дефинирана като последователност от буквено-цифрови символи, краят и се обозначава от празно пространство или от символ, който не е буква или цифра.

Следващият пример пасва с думата "class" само когато тя е цяла; ако тя се съдържа в рамките на друга дума, няма да има съвпадение.

>>> p = re.compile(r'\bclass\b')
>>> print p.search('no class at all')
<re.MatchObject instance at 80c8f28>
>>> print p.search('the declassified algorithm')
None
>>> print p.search('one subclass is')
None
Съществуват две тънкости, които трябва да имате предвид, когато използвате тези специални последователности. Първо, това е най-лошият сблъсък между символните низове в Питон и регулярните изрази. В Питон, "\b" е символът за връщане назад (backspace), с ASCII-стойност 8. Ако не използвате сурови символни низове, тогава Питон ще превърне "\b" в символ за връщане назад, и вашият РИ няма да пасва по очаквания от вас начин. Следващият пример изглежда като горния ни примерен РИ, но пред символния низ на РИ е пропуснат "r".

>>> p = re.compile('\bclass\b')
>>> print p.search('no class at all')
None
>>> print p.search('\b' + 'class' + '\b')  
<re.MatchObject instance at 80c3ee0>
Второ, вътре в клас от символи, където не може да се употребява това твърдение, за съвместимост със символните низове в Питон \b се счита за символ за връщане назад.
\B
Още едно твърдение с нулев размер. То е точно обратното на \b и пасва само на местата, които не се намират на границата на някоя дума.