分組

你常常須要獲得比 RE 是否匹配還要多的信息。正則表達式經常用來分析字符串,編寫一個 RE 匹配感興趣的部分並將其分紅幾個小組。舉個例子,一個 RFC-822 的頭部用 ":" 隔成一個頭部名和一個值,這就能夠經過編寫一個正則表達式匹配整個頭部,用一組匹配頭部名,另外一組匹配頭部值的方式來處理。python

組是經過 "(" 和 ")" 元字符來標識的。 "(" 和 ")" 有不少在數學表達式中相同的意思;它們一塊兒把在它們裏面的表達式組成一組。舉個例子,你能夠用重複限制符,象 *, +, ?, 和 {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。spring

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

小組是從左向右計數的,從1開始。組能夠被嵌套。計數的數值能夠經過從左到右計算打開的括號數來肯定。spa

#!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() 能夠一次輸入多個組號,在這種狀況下它將返回一個包含那些組所對應值的元組。code

#!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'
相關文章
相關標籤/搜索