详解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中的包和模块实例
Nov 22 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
Django异步任务线程池实现原理
Dec 17 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
python连接mongodb集群方法详解
Feb 13 Python
Python3运算符常见用法分析
Feb 14 Python
详解pandas映射与数据转换
Jan 22 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
php时区转换转换函数
2014/01/07 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
小学节能减排倡议书
2014/05/15 职场文书
商场消防安全责任书
2014/07/29 职场文书
Golang bufio详细讲解
2022/04/21 Golang