详解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爬虫模拟登录带验证码网站
Jan 22 Python
Python在线运行代码助手
Jul 15 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 Python
Python中新式类与经典类的区别详析
Jul 10 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
javascript中如何处理引号编码"
2013/08/15 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
python 图片验证码代码分享
2012/07/04 Python
python实现类的静态变量用法实例
2015/05/08 Python
Python映射拆分操作符用法实例
2015/05/19 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
如何用python免费看美剧
2020/08/11 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
信息部岗位职责
2013/11/12 职场文书
护士自荐信范文
2013/12/15 职场文书
生产总经理岗位职责
2013/12/19 职场文书
一名老师的自我评价
2014/02/07 职场文书
小学家长评语大全
2014/04/16 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
2015年植树节活动总结
2015/02/06 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python