详解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中运行并行任务技巧
Feb 26 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Python实现图像的垂直投影示例
Jan 17 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 Python
python实现三阶魔方还原的示例代码
Apr 28 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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设计模式 Composite (组合模式)
2011/06/26 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
限制复选框的最大可选数
2006/07/01 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
js中生成map对象的方法
2014/01/09 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
浅析vue深复制
2018/01/29 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
介绍一下Python中webbrowser的用法
2013/05/07 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
个人作风建设自查报告
2014/10/22 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python