更多的元字符

剩下來要討論的一部分元字符是零寬界定符(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 相反,只在當前位置不在單詞邊界時匹配。

相關文章
相關標籤/搜索