剖析、驗證規則表示式往往是最耗時間的階段,在頻繁使用某規則表示式的場合,若可以將剖析、驗證過後的規則表示式重複使用,對效率將會有所幫助。
re.compile
可以建立規則表示式物件,在剖析、驗證過規則表示式無誤後傳回的 Pattern
物件可以重複使用。例如:
regex = re.compile(r'.*foo')
re.compile
函式可以指定 flags
參數,例如想不分大小寫比對 dog 文字,可以如下:
regex = re.compile(r'dog', re.IGNORECASE)
re.IGNORECASE
與 re.I
都可用來設定不區分大小寫。類似地,re.S
與 re.DOTALL
同義,可令 .
亦比對換行字元;re.ASCII
與 re.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)
這樣的語法;嵌入旗標表示法可使用的字元有 a
、i
、L
、m
、s
、u
、x
等,各自對應著 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〉。