详解Python 最短匹配模式


Posted in Python onJuly 29, 2020

问题

你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。 而你想修改它变成查找最短的可能匹配。

解决方案

这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字符串)。 为了说明清楚,考虑如下的例子:

>>> str_pat = re.compile(r'"(.*)"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>

在这个例子中,模式 r'\"(.*)\"' 的意图是匹配被双引号包含的文本。 但是在正则表达式中*操作符是贪婪的,因此匹配操作会查找最长的可能匹配。 于是在第二个例子中搜索 text2 的时候返回结果并不是我们想要的。

为了修正这个问题,可以在模式中的*操作符后面加上?修饰符,就像这样:

>>> str_pat = re.compile(r'"(.*?)"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>

这样就使得匹配变成非贪婪模式,从而得到最短的匹配,也就是我们想要的结果。

讨论

这一节展示了在写包含点(.)字符的正则表达式的时候遇到的一些常见问题。 在一个模式字符串中,点(.)匹配除了换行外的任何字符。 然而,如果你将点(.)号放在开始与结束符(比如引号)之间的时候,那么匹配操作会查找符合模式的最长可能匹配。 这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。 通过在 * 或者 + 这样的操作符后面添加一个 ? 可以强制匹配算法改成寻找最短的可能匹配。

以上就是详解Python 最短匹配模式的详细内容,更多关于Python 最短匹配模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Python中使用HTML模版的教程
Apr 29 Python
python简单文本处理的方法
Jul 10 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python如何实现一个刷网页小程序
Nov 27 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
Django logging配置及使用详解
Jul 23 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
Pandas对每个分组应用apply函数的实现
Dec 13 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
Python如何给你的程序做性能测试
Jul 29 #Python
Python3爬虫中关于中文分词的详解
Jul 29 #Python
Python3爬虫中pyspider的安装步骤
Jul 29 #Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 #Python
Python3爬虫mitmproxy的安装步骤
Jul 29 #Python
Python使用jpype模块调用jar包过程解析
Jul 29 #Python
Python 防止死锁的方法
Jul 29 #Python
You might like
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
php中cookie的使用方法
2014/03/29 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python的Flask开发框架简单上手笔记
2015/11/16 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python中字符串与编码示例代码
2019/05/20 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python 实现矩阵填充0的例子
2019/11/29 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
个人查摆问题整改措施
2014/10/04 职场文书
看上去很美观后感
2015/06/10 职场文书
职工宿舍管理制度
2015/08/05 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers