Python實用技法第27篇:編寫多行模式的正則表達式

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標記就可以很好的完成工作。但是如果要處理及其複雜的模式,可以選擇利用非捕獲組定義在自己的表達式中,這樣無需額外的標記也能正常工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章