上一篇文章: Python實用技法第26篇:定義實現最短匹配的正則表達式
下一篇文章: Python實用技法第28篇:將Unicode文本統一表示爲規範形式
咱們打算用正則表達式對一段文本塊作匹配,可是但願在進行匹配時可以跨越多行。
這個問題通常出如今但願使用句點(.)來匹配任意字符,可是忘記了句點並不能匹配換行符。正則表達式
實例:假設向匹配C語言風格的註釋:segmentfault
import re str_pat=re.compile(r'/\*(.*?)\*/') text1="/* mark */" text2='''/* mark 2018 */''' print(str_pat.findall(text1)) print(str_pat.findall(text2))
結果:函數
[' mark '] []
要解決這個問題,能夠添加對換行符的支持。code
實例:get
import re #將.換成(?:.|\n) str_pat=re.compile(r'/\*((?:.|\n)*?)\*/') text1="/* mark */" text2='''/* mark 2018 */''' print(str_pat.findall(text1)) print(str_pat.findall(text2))
結果:import
[' mark '] [' mark \n 2018 ']
(?:.|n)指定了一個非捕獲組(即,這個組只作匹配但不捕獲結果,也不會分配組號)。im
re.compile()函數可接受一個有用的標記:re.DOTALL,這使得表達式中的句點【.】能夠匹配全部的字符,也包括換行符。註釋
實例:語言
import re str_pat=re.compile(r'/\*(.*?)\*/',re.DOTALL) text1="/* mark */" text2='''/* mark 2018 */''' print(str_pat.findall(text1)) print(str_pat.findall(text2))
結果:解決方案
[' mark '] [' mark \n 2018 ']
對於簡單的狀況,使用re.DOTALL標記就能夠很好的完成工做。可是若是要處理及其複雜的模式,能夠選擇利用非捕獲組定義在本身的表達式中,這樣無需額外的標記也能正常工做。
上一篇文章: Python實用技法第26篇:定義實現最短匹配的正則表達式
下一篇文章: Python實用技法第28篇:將Unicode文本統一表示爲規範形式