剩下來要討論的一部分元字符是零寬界定符(zero-width assertions)。它們並不會使引擎在處理字符串時更快;相反,它們根本就沒有對應任何字符,只是簡單的成功或失敗。舉個例子, \b 是一個在單詞邊界定位當前位置的界定符(assertions),這個位置根本就不會被 \b 改變。這意味着零寬界定符(zero-width assertions)將永遠不會被重複,由於若是它們在給定位置匹配一次,那麼它們很明顯能夠被匹配無數次。python
|正則表達式
可選項,或者 "or" 操做符。若是 A 和 B 是正則表達式,A|B 將匹配任何匹配了 "A" 或 "B" 的字符串。| 的優先級很是低,是爲了當你有多字符串要選擇時能適當地運行。Crow|Servo 將匹配"Crow" 或 "Servo", 而不是 "Cro", 一個 "w" 或 一個 "S", 和 "ervo"。code
爲了匹配字母 "|",能夠用 |,或將其包含在字符類中,如[|]。ci
^字符串
匹配行首。除非設置 MULTILINE 標誌,它只是匹配字符串的開始。在 MULTILINE 模式裏,它也能夠直接匹配字符串中的每一個換行。string
例如,若是你只但願匹配在行首單詞 "From",那麼 RE 將用 ^From。it
#!python >>> print re.search('^From', 'From Here to Eternity') <re.MatchObject instance at 80c1520> >>> print re.search('^From', 'Reciting From Memory') None
$io
匹配行尾,行尾被定義爲要麼是字符串尾,要麼是一個換行字符後面的任何位置。class
#!python >>> 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
Matches only at the end of the string. 只匹配字符串尾。
\b
單詞邊界。這是個零寬界定符(zero-width assertions)只用以匹配單詞的詞首和詞尾。單詞被定義爲一個字母數字序列,所以詞尾就是用空白符或非字母數字符來標示的。
下面的例子只匹配 "class" 整個單詞;而當它被包含在其餘單詞中時不匹配。
#!python >>> 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
當用這個特殊序列時你應該記住這裏有兩個微妙之處。第一個是 Python 字符串和正則表達式之間最糟的衝突。在 Python 字符串裏,"\b" 是反斜槓字符,ASCII值是8。若是你沒有使用 raw 字符串時,那麼 Python 將會把 "\b" 轉換成一個回退符,你的 RE 將沒法象你但願的那樣匹配它了。下面的例子看起來和咱們前面的 RE 同樣,但在 RE 字符串前少了一個 "r" 。
#!python >>> p = re.compile('\bclass\b') >>> print p.search('no class at all') None >>> print p.search('\b' + 'class' + '\b') <re.MatchObject instance at 80c3ee0>
第二個在字符類中,這個限定符(assertion)不起做用,\b 表示回退符,以便與 Python 字符串兼容。
\B
另外一個零寬界定符(zero-width assertions),它正好同 \b 相反,只在當前位置不在單詞邊界時匹配。