Python 正規表示式_re模組_使用compile加速 Dus 發表於2015-02-09
使用compile加速
compile( rule [,flag] )
將正則規則編譯成一個Pattern 物件,以供接下來使用。
第一個引數是規則式,第二個引數是規則選項。
返回一個Pattern 物件
直接使用findall ( rule , target ) 的方式來匹配字串,一次兩次沒什麼,如果是多次使用的話,由於正則引擎每次都要把規則解釋一遍,而規則的解釋又是相當費時間的,所以這樣的效率就很低了。如果要多次使用同一規則來進行匹配的話,可以使用re.compile 函式來將規則預編譯,使用編譯過返回的Regular Expression Object 或叫做Pattern 物件來進行查詢。
例
>>> s='111,222,aaa,bbb,ccc333,444ddd'
>>> rule=r’\b\d+\b’
>>> compiled_rule=re.compile(rule)
>>> compiled_rule.findall(s)
['111', '222']
可見使用compile 過的規則使用和未編譯的使用很相似。compile 函式還可以指定一些規則標誌,來指定一些特殊選項。多個選項之間用 ’| ’ (位或)連線起來。
I IGNORECASE 忽略大小寫區別。
L LOCAL 字符集本地化。這個功能是為了支援多語言版本的字符集使用環境的,比如在轉義符\w,在英文環境下,它代表[a-zA-Z0-9],即所以英文字元和數字。如果在一個法語環境下使用,預設設定下,不能匹配"é" 或 "ç" 。加上這L 選項和就可以匹配了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字元。
M MULTILINE 多行匹配。在這個模式下’^’( 代表字串開頭) 和’$’( 代表字串結尾) 將能夠匹配多行的情況,成為行首和行尾標記。比如
>>> s=’123 456\n789 012\n345 678’
>>> rc=re.compile(r’^\d+’) # 匹配一個位於開頭的數字,沒有使用M 選項
>>> rc.findall(s)
['123'] # 結果只能找到位於第一個行首的’123’
>>> rcm=re.compile(r’^\d+’,re.M) # 使用 M 選項
>>> rcm.findall(s)
['123', '789', '345'] # 找到了三個行首的數字
同樣,對於’$’ 來說,沒有使用M 選項,它將匹配最後一個行尾的數字,即’678’ ,加上以後,就能匹配三個行尾的數字456 012 和678 了.
>>> rc=re.compile(r’\d+$’)
>>> rcm=re.compile(r’\d+$’,re.M)
>>> rc.findall(s)
['678']
>>> rcm.findall(s)
['456', '012', '678']
S DOTALL ‘.’ 號將匹配所有的字元。預設情況下’.’ 匹配除換行符’\n’ 外的所有字元,使用這一選項以後,’.’ 就能匹配包括’\n’ 的任何字元了。
U UNICODE \w , \W , \b , \B , \d , \D , \s 和 \S 都將使用Unicode。
X VERBOSE 這個選項忽略規則表示式中的空白,並允許使用’#’ 來引導一個註釋。這樣可以讓你把規則寫得更美觀些。比如你可以把規則
>>> rc = re.compile(r"\d+|[a-zA-Z]+") #匹配一個數字或者單詞
使用X 選項寫成:
>>> rc = re.compile(r""" # start a rule
\d+ # number
| [a-zA-Z]+ # word
""", re.VERBOSE)
在這個模式下,如果你想匹配一個空格,你必須用'\ '的形式('\'後面跟一個空格)