如果想在搜尋某字串,看看是否有子字串符合規則表示式,可以使用 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'>