Python 正規表示式_re模組_使用compile加速

Dus發表於2015-02-09

使用compile加速

compile( rule [,flag] )

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

相關文章