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文本统一表示为规范形式
相关文章
相关标签/搜索