详解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正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
解析Python中的二进制位运算符
May 13 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Python单例模式的两种实现方法
Aug 14 Python
Python线程创建和终止实例代码
Jan 20 Python
Python File readlines() 使用方法
Mar 19 Python
python中的变量如何开辟内存
Jun 26 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python tkinter实现简单加法计算器代码实例
May 13 Python
详解python datetime模块
Aug 17 Python
Python采集股票数据并制作可视化柱状图
Apr 04 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python实现接口并发测试脚本
2019/06/25 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python实现邮件循环自动发件功能
2020/09/11 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2014年资料员工作总结
2014/11/18 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
MySQL学习之基础命令实操总结
2022/03/19 MySQL