Има още няколко метасимвола, които не сме обхванали досега. Повечето от тях ще
бъдат разгледани в този раздел.
Някои от оставащите метасимволи, които ще дискутираме, са твърдения с
нулев размер. Те изобщо не карат машината да напредне нататък в символния
низ. Вместо да консумират символи, те просто успяват или се провалят.
Например, \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 и пасва само на местата, които не се намират на границата
на някоя дума.