### 執行匹配
一旦你有了已經編譯了的正則表達式的對象,你要用它做什么呢?`RegexObject` 實例有一些方法和屬性。這里只顯示了最重要的幾個,如果要看完整的列表請查閱 Python Library Reference
| 方法/屬性 | 作用 |
| --- | --- |
| match() | 決定 RE 是否在字符串剛開始的位置匹配 |
| search() | 掃描字符串,找到這個 RE 匹配的位置 |
| findall() | 找到 RE 匹配的所有子串,并把它們作為一個列表返回 |
| finditer() | 找到 RE 匹配的所有子串,并把它們作為一個迭代器返回 |
如果沒有匹配到的話,match() 和 search() 將返回 None。如果成功的話,就會返回一個 `MatchObject` 實例,其中有這次匹配的信息:它是從哪里開始和結束,它所匹配的子串等等。
你可以用采用人機對話并用 re 模塊實驗的方式來學習它。如果你有 Tkinter 的話,你也許可以考慮參考一下 Tools/scripts/redemo.py,一個包含在 Python 發行版里的示范程序。
首先,運行 Python 解釋器,導入 re 模塊并編譯一個 RE:
```
#!python
Python 2.2.2 (#1, Feb 10 2003, 12:57:01)
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
<_sre.SRE_Pattern object at 80c3c28>
```
現在,你可以試著用 RE 的 [a-z]+ 去匹配不同的字符串。一個空字符串將根本不能匹配,因為 + 的意思是 “一個或更多的重復次數”。 在這種情況下 match() 將返回 None,因為它使解釋器沒有輸出。你可以明確地打印出 match() 的結果來弄清這一點。
```
#!python
>>> p.match("")
>>> print p.match("")
None
```
現在,讓我們試著用它來匹配一個字符串,如 "tempo"。這時,match() 將返回一個 MatchObject。因此你可以將結果保存在變量里以便後面使用。
```
#!python
>>> m = p.match( 'tempo')
>>> print m
<_sre.SRE_Match object at 80c4f68>
```
現在你可以查詢 `MatchObject` 關于匹配字符串的相關信息了。MatchObject 實例也有幾個方法和屬性;最重要的那些如下所示:
| 方法/屬性 | 作用 |
| --- | --- |
| group() | 返回被 RE 匹配的字符串 |
| start() | 返回匹配開始的位置 |
| end() | 返回匹配結束的位置 |
| span() | 返回一個元組包含匹配 (開始,結束) 的位置 |
試試這些方法不久就會清楚它們的作用了:
```
#!python
>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)
```
group() 返回 RE 匹配的子串。start() 和 end() 返回匹配開始和結束時的索引。span() 則用單個元組把開始和結束時的索引一起返回。因為匹配方法檢查到如果 RE 在字符串開始處開始匹配,那么 start() 將總是為零。然而, `RegexObject` 實例的 search 方法掃描下面的字符串的話,在這種情況下,匹配開始的位置就也許不是零了。
```
#!python
>>> print p.match('::: message')
None
>>> m = p.search('::: message')?; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)
```
在實際程序中,最常見的作法是將 `MatchObject` 保存在一個變量里,然後檢查它是否為 None,通常如下所示:
```
#!python
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
print 'Match found: ', m.group()
else:
print 'No match'
```
兩個 `RegexObject` 方法返回所有匹配模式的子串。findall()返回一個匹配字符串行表:
```
#!python
>>> p = re.compile('\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']
```
findall() 在它返回結果時不得不創建一個列表。在 Python 2.2中,也可以用 finditer() 方法。
```
#!python
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
... print match.span()
...
(0, 2)
(22, 24)
(29, 31)
```