浅析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线程中对join方法的运用的教程
Apr 09 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
Python的几种主动结束程序方式
Nov 22 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
Python绘制组合图的示例
Sep 18 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
新手必备Python开发环境搭建教程
May 28 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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新手上路(四)
2006/10/09 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php 特殊字符处理函数
2008/09/05 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
php上传excel表格并获取数据
2017/04/27 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
jQuery实用技巧必备(下)
2015/11/03 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
Python实现购物车程序
2018/04/16 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
人力资源主管岗位职责
2014/01/29 职场文书
餐厅总厨求职信
2014/03/04 职场文书
小学一年级学生评语
2014/04/22 职场文书
学校标语大全
2014/06/19 职场文书
检讨书怎么写
2015/05/07 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
浅谈MySQL函数
2021/10/05 MySQL