Pattern 物件


剖析、驗證規則表示式往往是最耗時間的階段,在頻繁使用某規則表示式的場合,若可以將剖析、驗證過後的規則表示式重複使用,對效率將會有所幫助。

re.compile 可以建立規則表示式物件,在剖析、驗證過規則表示式無誤後傳回的 Pattern 物件可以重複使用。例如:

regex = re.compile(r'.*foo')

re.compile 函式可以指定 flags 參數,例如想不分大小寫比對 dog 文字,可以如下:

regex = re.compile(r'dog', re.IGNORECASE)

re.IGNORECASEre.I 都可用來設定不區分大小寫。類似地,re.Sre.DOTALL 同義,可令 . 亦比對換行字元;re.ASCIIre.A 同義,可令 \w\w\b\B\d\D\s\S 只比對 ASCII 字元(在 Python 3.x 中,預設是會比對 Unicode 字元):

>>> import re
>>> re.compile('\w').search('林')
<re.Match object; span=(0, 1), match='林'>
>>> re.compile('.w', re.A).search('林') == None
True

如果有多個旗標必須設定,可以使用 |,例如:

>>> re.compile(r'[az]$', re.DOTALL | re.I)
re.compile('[az]$', re.IGNORECASE|re.DOTALL)

更多的旗標設定,可參考 re.compile 文件;也可以在規則表示式中使用嵌入旗標表示法(Embedded Flag Expression)。例如 re.IGNORECASE 等效的嵌入旗標表示法為 (?i)

regex= re.compile('(?i)dog')

若想對特定分組嵌入旗標,可以使用 (?i:dog) 這樣的語法;嵌入旗標表示法可使用的字元有 aiLmsux 等,各自對應著 re.compile 函式的 flags 參數之作用。

在取得規則表示式物件後,可以使用 split 方法,將指定字串依規則表示式切割,效果等同於使用 re.split 函式,基本上,在〈Match 物件〉中談到的 re 模組中之函式,Pattern 上都有對應的版本。

findall() 方法找出符合的全部子字串,效果等同於使用 re.findall 函式:

>>> dog = re.compile('(?i)dog')
>>> dog.split('The Dog is mine and that dog is yours')
['The ', ' is mine and that ', ' is yours']
>>> dog.findall('The Dog is mine and that dog is yours')
['Dog', 'dog']

Pattern 實例可以使用 finditer 方法,它會傳回一個iterable物件,每一次迭代都會得到一個 Match 物件。例如:

>>> dog = re.compile('(?i)dog')
>>> for m in dog.finditer('The Dog is mine and that dog is yours'):
...     print(m.group(), 'between', m.start(), 'and', m.end())
...
Dog between 4 and 7
dog between 25 and 28

更多關於 Pattern 物件的方法,可以參考〈Regular Expression Objects〉。