2016年7月3日 星期日

Python_Note16

Regular expression operations

參考資料:

正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。在很多文字編輯器裡,正則運算式通常被用來檢索、取代那些符合某個模式的文字,並且藉此從檔案中抓取出想要的內容。

正規表示式的大致匹配過程是:
  1. 依序拿出表達式和文本中的字符比較,
  2. 如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  3. 如果表示式中有量詞或邊界,這個過程會稍微有一些不同。
Python已經內建正規表示式模組re,引入方式為  import re

常用的方法:

  • re.compile(string[,flag])
  • re.match(pattern, string[, flags]

這個方法將會從string(我們要匹配的字符串)的開頭開始,嘗試匹配pattern,一直向後匹配,如果遇到無法匹配的字符,立即返回None,如果匹配未結束已經到達string 的末尾,也會返回None。兩個結果均表示匹配失敗,否則匹配pattern 成功,同時匹配終止,不再對string 向後匹配。

  • re.search(pattern, string[, flags]

searrch方法與match 方法極其類似,區別在於match() 函數只檢測re 是不是在string的開始位置匹配,search() 會掃描整個string 查找匹配,match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match() 就返回None

  • re.split(pattern, string[, maxsplit]

按照能夠匹配的子串將string 分割後返回列表。maxsplit 用於指定最大分割次數,不指定將全部分割。

  • re.findall(pattern, string[, flags]

搜索string,以列表形式返回全部能匹配的子串。

  • re.finditer(pattern, string[, flags]

搜索string,返回一個順序訪問每一個匹配結果(Match對象)的迭代器。

  • re.sub(pattern, repl, string[, count]

使用repl 替換string 中每一個匹配的子串後返回替換後的字符串。當repl 是一個字符串時,可以使用\id \g\g 引用分組,但不能使用編號0。當repl 是一個方法時,這個方法應當只接受一個參數(Match對象),並返回一個字符串用於替換(返回的字符串中不能再引用分組)。count 用於指定最多替換次數,不指定時全部替換。

  • re.subn(pattern, repl, string[, count]

返回(sub(repl, string[, count]), 替換次數)


其中,參數flag 是匹配模式,取值可以使用按位或運算符'|'表示同時生效,比如re.I | re.M。上述七個方法中的flags 同樣是代表匹配模式的意思,如果在pattern 生成時已經指明了flags,那麼在之後的方法中就不需要傳入這個參數了。

參數可選值:
re.I(全拼:IGNORECASE
忽略大小寫(括號內是完整寫法,下同)
re.M(全拼:MULTILINE
多行模式,改變'^''$'的行為(參見上圖)
re.S(全拼:DOTALL
點任意匹配模式,改變'.'的行為
re.L(全拼:LOCALE
使預定字符類\w \W \b \B \s \S 取決於當前區域設定
re.U(全拼:UNICODE
使預定字符類\w \W \b \B \s \S \d \D 取決於unicode定義的字符屬性
re.X(全拼:VERBOSE
詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入註釋。


正規表示式的一些匹配規則:

範例:
In[8]: import re
In[9]: string = 'abc12dedg345hi67jklm8910'
In[10]: pat = '...\d\d'    #3個字符+2個數字
In[11]: print(re.findall(pat,string))     #找匹配pat的字串並儲存為list
['abc12', 'edg34', '5hi67', 'klm89']
In[12]: pat = '...\d\d\d'    #3個字符+3個數字
In[13]: print(re.findall(pat,string))
['edg345', 'klm891']
In[14]: pat = '...\d\d\d\d'    #3個字符+4個數字
In[15]: print(re.findall(pat,string))
['klm8910']
In[16]: pat = '\d\d'        #2個數字
In[17]: print(re.findall(pat,string))
['12', '34', '67', '89', '10']



沒有留言:

張貼留言