详解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 31 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
Pandas中resample方法详解
Jul 02 Python
Python 3.8 新功能全解
Jul 25 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
详解python中各种文件打开模式
Jan 19 Python
Python urllib2运行过程原理解析
Jun 04 Python
学习Python爬虫的几点建议
Aug 05 Python
Django如何实现密码错误报错提醒
Sep 04 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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代码
2007/03/08 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
DOM 基本方法
2009/07/18 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Python中GIL的使用详解
2018/10/03 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
python logging日志模块原理及操作解析
2019/10/12 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
社区党员志愿服务活动方案
2014/08/18 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
优秀教师单行材料
2014/12/16 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书