浅析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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
Python 中 Meta Classes详解
Feb 13 Python
Python如何实现文本转语音
Aug 08 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
python 读取、写入txt文件的示例
Sep 27 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
教大家制作简单的php日历
2015/11/17 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
python实现最长公共子序列
2018/05/22 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
python读写csv文件方法详细总结
2019/07/05 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
flask框架中的cookie和session使用
2021/01/31 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
《月亮湾》教学反思
2014/04/14 职场文书
财务会计专业自荐书
2014/06/30 职场文书
公司经营目标责任书
2015/01/29 职场文书
美术教师个人工作总结
2015/02/06 职场文书
小学数学教师研修感悟
2015/11/18 职场文书