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

上一篇文章: 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文本統一表示爲規範形式
相關文章
相關標籤/搜索