執行匹配

RegexObject 實例有一些方法和屬性。這裏只顯示了最重要的幾個,若是要看完整的列表請查閱 Python Library Referencepython

方法/屬性 做用
match() 決定 RE 是否在字符串剛開始的位置匹配
search() 掃描字符串,找到這個 RE 匹配的位置
findall() 找到 RE 匹配的全部子串,並把它們做爲一個列表返回
finditer() 找到 RE 匹配的全部子串,並把它們做爲一個迭代器返回

若是沒有匹配到的話,match() 和 search() 將返回 None。若是成功的話,就會返回一個 MatchObject 實例,其中有此次匹配的信息:它是從哪裏開始和結束,它所匹配的子串等等。api

你能夠用採用人機對話並用 re 模塊實驗的方式來學習它。若是你有 Tkinter 的話,你也許能夠考慮參考一下 Tools/scripts/redemo.py,一個包含在 Python 發行版裏的示範程序。學習

首先,運行 Python 解釋器,導入 re 模塊並編譯一個 RE:spa

#!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() 的結果來弄清這一點。code

#!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 實例也有幾個方法和屬性;最重要的那些以下所示:ip

方法/屬性 做用
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 方法掃描下面的字符串的話,在這種狀況下,匹配開始的位置就也許不是零了。string

#!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,一般以下所示:it

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