上一篇文章: 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文本统一表示为规范形式