浅析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实现闹钟定时播放音乐功能
Jan 25 Python
python smtplib发送带附件邮件小程序
May 22 Python
从django的中间件直接返回请求的方法
May 30 Python
Flask之flask-session的具体使用
Jul 26 Python
python flask框架实现重定向功能示例
Jul 02 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
在python shell中运行python文件的实现
Dec 21 Python
使用python的pyplot绘制函数实例
Feb 13 Python
通过实例简单了解python yield使用方法
Aug 06 Python
Python字符串查找基本操作代码案例
Oct 27 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
JavaScript 事件的一些重要说明
2009/10/25 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
python实现整数的二进制循环移位
2019/03/08 Python
python动态进度条的实现代码
2019/07/03 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
大二自我鉴定
2014/01/31 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python