详解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操作CouchDB数据库简单示例
Mar 10 Python
python中requests模块的使用方法
Apr 08 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python批量替换页眉页脚实例代码
Jan 22 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
详解Django中类视图使用装饰器的方式
Aug 12 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
python产生模拟数据faker库的使用详解
Nov 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
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
一道Delphi上机题
2012/06/04 面试题
物业经理求职自我评价
2013/09/22 职场文书
毕业生个人的求职信范文
2013/12/03 职场文书
小学新教师培训方案
2014/02/03 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
工作岗位说明书模板
2014/05/09 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
2015员工年度考核评语
2015/03/25 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
html5实现点击弹出图片功能
2021/07/16 HTML / CSS