Match 物件


如果想在搜尋某字串,看看是否有子字串符合規則表示式,可以使用 re.search,若無匹配傳回 None,若有匹配,會傳回 match 物件,例如:

>>> import re
>>> m = re.search(r'\d{3}', "Kaohsiung 803, Road 12")
>>> m.group()
'803'
>>> m.start()
10
>>> m.end()
13

可以使用 match 物件的 group 方法來取得符合整個規則表示式的子字串,使用 start 來取得子字串的起始索引,end 來取得結尾索引。

search 類似的是 match 函式,search 會在整個字串中,找尋第一個符合的子字串,而 match 只會在字串開頭看看接下來的字串是否符合,若有符合也是傳回 match 物件,若無傳回 None

>>> m = re.match(r'\d{3}', "Kaohsiung 803, Road 12")
>>> m == None
True
>>> m = re.match(r'\d{3}', "803, Road 12")
>>> m.group()
'803'

若規則表示式有分組,match 物件的 group 方法可以傳入數字,取得指定的分組,group 可以接受多個數字作為引數:

>>> m = re.match(r'(\w+) (\w+)', 'Isaac Newton, physicist')
>>> m.group(0)
'Isaac Newton'
>>> m.group(1)
'Isaac'
>>> m.group(2)
'Newton'
>>> m.group(1, 2)
('Isaac', 'Newton')

如果分組時有命名,group 也可以接受名稱:

>>> m = re.match(r'(?P<user>^[a-zA-Z]+\d*)@(?P<preCom>[a-z]+?.)com', 'caterpillar@openhome.com')
>>> m.group('user')
'caterpillar'
>>> m.group('preCom')
'openhome.'
>>> m['user']
'caterpillar'
>>> m[1]
'caterpillar'
>>> m.groups()
('caterpillar', 'openhome.')
>>> m.groupdict()
{'user': 'caterpillar', 'preCom': 'openhome.'}

由於 match 實作了 __getitem__ 方法,如上所示,你也可以使用 [] 來取得分組結果;match 物件的 groups 方法,則用來取得全部的分組結果,groupdict 用來取得 dict,包含了分組命名與結果。

更多 match 物件的方法或特性,可以參考〈Match Objects〉。

如果要求整個字串符合規則表示式,可以使用 re.fullmatch(Python 3.4),例如:

>>> m = re.fullmatch(r'(?P<user>^[a-zA-Z]+\d*)@(?P<preCom>[a-z]+?.)com', 'caterpillar@openhome.com is valid')
>>> m == None
True
>>> re.match(r'(?P<user>^[a-zA-Z]+\d*)@(?P<preCom>[a-z]+?.)com', 'caterpillar@openhome.com is valid')
<re.Match object; span=(0, 24), match='caterpillar@openhome.com'>