详解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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
Python import用法以及与from...import的区别
May 28 Python
Python代码缩进和测试模块示例详解
May 07 Python
Python 打印中文字符的三种方法
Aug 14 Python
python如何生成各种随机分布图
Aug 27 Python
对numpy中向量式三目运算符详解
Oct 31 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
Python实现GIF图倒放
Jul 16 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 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 CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
python解析xml文件操作实例
2014/10/05 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
python编写计算器功能
2019/10/25 Python
Python 列表的清空方式
2020/01/13 Python
python文件排序的方法总结
2020/09/13 Python
Python实现异步IO的示例
2020/11/05 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
社区活动总结
2015/02/04 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
特此通知格式
2015/04/27 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript