天天看點

分組

你經常需要得到比 RE 是否比對還要多的資訊。正規表達式常常用來分析字元串,編寫一個 RE 比對感興趣的部分并将其分成幾個小組。舉個例子,一個 RFC-822 的頭部用 ":" 隔成一個頭部名和一個值,這就可以通過編寫一個正規表達式比對整個頭部,用一組比對頭部名,另一組比對頭部值的方式來處理。

組是通過 "(" 和 ")" 元字元來辨別的。 "(" 和 ")" 有很多在數學表達式中相同的意思;它們一起把在它們裡面的表達式組成一組。舉個例子,你可以用重複限制符,象 *, +, ?, 和 {m,n},來重複組裡的内容,比如說(ab)* 将比對零或更多個重複的 "ab"。

#!python
>>> p = re.compile('(ab)*')
>>> print p.match('ababababab').span()
(0, 10)
           

組用 "(" 和 ")" 來指定,并且得到它們比對文本的開始和結尾索引;這就可以通過一個參數用 group()、start()、end() 和 span() 來進行檢索。組是從 0 開始計數的。組 0 總是存在;它就是整個 RE,是以 

MatchObject

 的方法都把組 0 作為它們預設的參數。稍後我們将看到怎樣表達不能得到它們所比對文本的 span。

#!python
>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'
           

小組是從左向右計數的,從1開始。組可以被嵌套。計數的數值可以通過從左到右計算打開的括号數來确定。

#!python
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
           

group() 可以一次輸入多個組号,在這種情況下它将傳回一個包含那些組所對應值的元組。

#!python
>>> m.group(2,1,2)
('b', 'abc', 'b')
           

The groups() 方法傳回一個包含所有小組字元串的元組,從 1 到 所含的小組号。

#!python
>>> m.groups()
('abc', 'b')
           

模式中的逆向引用允許你指定先前捕獲組的内容,該組也必須在字元串目前位置被找到。舉個例子,如果組 1 的内容能夠在目前位置找到的話,\1 就成功否則失敗。記住 Python 字元串也是用反斜杠加資料來允許字元串中包含任意字元的,是以當在 RE 中使用逆向引用時確定使用 raw 字元串。

例如,下面的 RE 在一個字元串中找到成雙的詞。

#!python
>>> p = re.compile(r'(\b\w+)\s+\1')
>>> p.search('Paris in the the spring').group()
'the the'