1、需求
我們打算用正則表達式對一段文本塊做匹配,但是希望在進行匹配時能夠跨越多行。
2、解決方案
這個問題一般出現在希望使用句點(.)來匹配任意字符,但是忘記了句點並不能匹配換行符。
實例:假設向匹配C語言風格的註釋:
import re
str_pat=re.compile(r'/\*(.*?)\*/')
text1="/* mark */"
text2='''/* mark
2018 */'''
print(str_pat.findall(text1))
print(str_pat.findall(text2))
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎
結果:
[' mark ']
[]
要解決這個問題,可以添加對換行符的支持。
實例:
import re
#將.換成(?:.|\n)
str_pat=re.compile(r'/\*((?:.|\n)*?)\*/')
text1="/* mark */"
text2='''/* mark
2018 */'''
print(str_pat.findall(text1))
print(str_pat.findall(text2))
結果:
[' mark ']
[' mark \n 2018 ']
(?:.|n)指定了一個非捕獲組(即,這個組只做匹配但不捕獲結果,也不會分配組號)。
3、分析
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 ']
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎
對於簡單的情況,使用re.DOTALL標記就可以很好的完成工作。但是如果要處理及其複雜的模式,可以選擇利用非捕獲組定義在自己的表達式中,這樣無需額外的標記也能正常工作。