博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实用技法第27篇:编写多行模式的正则表达式
阅读量:6236 次
发布时间:2019-06-22

本文共 968 字,大约阅读时间需要 3 分钟。

上一篇文章:
下一篇文章:

1、需求?

我们打算用正则表达式对一段文本块做匹配,但是希望在进行匹配时能够跨越多行。

2、解决方案?

这个问题一般出现在希望使用句点(.)来匹配任意字符,但是忘记了句点并不能匹配换行符。

实例:假设向匹配C语言风格的注释:

import restr_pat=re.compile(r'/\*(.*?)\*/')text1="/* mark */"text2='''/* mark             2018    */'''print(str_pat.findall(text1))print(str_pat.findall(text2))

结果:

[' 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 restr_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标记就可以很好的完成工作。但是如果要处理及其复杂的模式,可以选择利用非捕获组定义在自己的表达式中,这样无需额外的标记也能正常工作。

上一篇文章:
下一篇文章:

转载地址:http://qgzia.baihongyu.com/

你可能感兴趣的文章
JDBC的事务
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
nagios客户端未启动报错
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
flutter中的异步
查看>>
计算机高手也不能编出俄罗斯方块——计算机达人成长之路(16)
查看>>
error LNK2001: 无法解析的外部符号 __CrtDbgReport
查看>>
会员充值-》解决方案之一
查看>>
Jmeter的接口测试简介
查看>>
洛谷P3369 【模板】普通平衡树(FHQ Treap)
查看>>