Regular expression operations
參考資料:
正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。在很多文字編輯器裡,正則運算式通常被用來檢索、取代那些符合某個模式的文字,並且藉此從檔案中抓取出想要的內容。
正規表示式的大致匹配過程是:
- 依序拿出表達式和文本中的字符比較,
- 如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
- 如果表示式中有量詞或邊界,這個過程會稍微有一些不同。
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']
沒有留言:
張貼留言