浅析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自动化测试之setUp与tearDown实例
Sep 28 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
机器学习实战之knn算法pandas
Jun 22 Python
手写一个python迭代器过程详解
Aug 27 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
python 如何快速复制序列
Sep 07 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扩展开发经验分享
2012/09/06 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
js验证上传图片的方法
2015/05/12 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
Vue表单实例代码
2016/09/05 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
vscode自定义vue模板的实现
2021/01/27 Vue.js
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
详细解读Python中解析XML数据的方法
2015/10/15 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python 获取项目根路径的代码
2019/09/27 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
Python实现括号匹配方法详解
2020/02/10 Python
python语言中有算法吗
2020/06/16 Python
python 代码运行时间获取方式详解
2020/09/18 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
const和static readonly区别
2013/05/20 面试题
中职应届生会计求职信
2013/10/23 职场文书
企划经理的岗位职责
2013/11/17 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
先进工作者个人总结
2015/02/15 职场文书
信用卡工作证明范本
2015/06/19 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
python实现过滤敏感词
2021/05/08 Python
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python