浅析Python 多行匹配模式


Posted in Python onJuly 24, 2020

问题

你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。

解决方案

这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。比如,假设你想试着去匹配C语言分割的注释:

>>> comment = re.compile(r'/\*(.*?)\*/')
>>> text1 = '/* this is a comment */'
>>> text2 = '''/* this is a
... multiline comment */
... '''
>>>
>>> comment.findall(text1)
[' this is a comment ']
>>> comment.findall(text2)
[]
>>>

为了修正这个问题,你可以修改模式字符串,增加对换行的支持。比如:

>>> comment = re.compile(r'/\*((?:.|\n)*?)\*/')
>>> comment.findall(text2)
[' this is a\n multiline comment ']
>>>

在这个模式中,(?:.|\n) 指定了一个非捕获组(也就是它定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。

讨论

re.compile() 函数接受一个标志参数叫 re.DOTALL ,在这里非常有用。它可以让正则表达式中的.匹配包括换行符在内的任意字符。比如:

>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
>>> comment.findall(text2)
[' this is a\n multiline comment ']

对于简单的情况使用 re.DOTALL 标记参数工作的很好,但是如果模式非常复杂或者是为了构造字符串令牌而将多个模式合并起来(2.18节有详细描述),这时候使用这个标记参数就可能出现一些问题。如果让你选择的话,最好还是定义自己的正则表达式模式,这样它可以在不需要额外的标记参数下也能工作的很好。

以上就是浅析Python 多行匹配模式的详细内容,更多关于Python 多行匹配模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python基于mysql实现学生管理系统
Feb 21 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
简单了解python PEP的一些知识
Jul 13 Python
如何在python中实现随机选择
Nov 02 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
keras 权重保存和权重载入方式
May 21 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
python中tab键是什么意思
Jun 18 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
python实现学生信息管理系统源码
Feb 22 Python
Python图像处理二值化方法实例汇总
Jul 24 #Python
Python如何合并多个字典或映射
Jul 24 #Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 #Python
Python3.7安装pyaudio教程解析
Jul 24 #Python
python调用私有属性的方法总结
Jul 24 #Python
python中取绝对值简单方法总结
Jul 24 #Python
python代码能做成软件吗
Jul 24 #Python
You might like
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python分割一个文本为多个文本的方法
2019/07/22 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
事业单位请假制度
2014/01/13 职场文书
廉洁使者实施方案
2014/03/29 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
工程安全生产协议书
2014/11/21 职场文书
会议简讯范文
2015/07/20 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python