浅析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 dict remove数组删除(del,pop)
Mar 24 Python
Tornado 多进程实现分析详解
Jan 12 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python系列 文件操作的代码
Oct 06 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
五种Python转义表示法
Nov 27 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的5个入手程序
2006/11/23 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
Javascript中神奇的this
2016/01/20 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
小学生新学期寄语
2014/01/19 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
设备收款委托书范本
2014/10/02 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
SQL注入详解及防范方法
2021/12/06 MySQL
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server