你常常須要獲得比 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'