### 分組
你經常需要得到比 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'
```
象這樣只是搜索一個字符串的逆向引用并不常見 -- 用這種方式重復數據的文本格式并不多見 -- 但你不久就可以發現它們用在字符串替換上非常有用。