python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析


Posted in Python onOctober 14, 2019

本文实例讲述了python 正则表达式贪婪模式与非贪婪模式原理、用法。分享给大家供大家参考,具体如下:

之前未接触过正则表达式,今日看python网络爬虫的源码,里面一行正则表达式匹配的代码初看之下,不是很理解,代码如下:

myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)

“.*?”这种匹配方式,按理解应该是匹配任意字符0个或多个(re.S模式,“.”可以匹配“\n”),但是这个“?”总觉的在这儿是多余的,既然不理解,就敲代码试试:

import re
patern = re.compile('www\..*')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.baidu.com

这个结果,应该说是意料之中,加个“?”呢?

import re
patern = re.compile('www\..*?')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.

竟然是这个结果。。。“.?”一个字符都没匹配,按“.”、“”、“?”的匹配理解,也就是“*”“?”均匹配前面字符0次,才会是这个结果,可是为啥就是0次了?

这就是正则表达式贪婪模式和非贪婪模式:

  • 贪婪模式,总是尝试匹配尽可能多的字符;
  • 非贪婪模式则相反,总是尝试匹配尽可能少的字符。

Python里数量词默认是贪婪的,这就解释了第一个匹配实验,输出结果为”www.baidu.com”(贪婪模式),也就是说第二个匹配实验是非贪婪模式,仅仅因为加了“?”,继续实验

import re
patern = re.compile('www\..?')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.b

此次匹配结果,显然是贪婪模式。奇怪了,也就是“?”的特殊组合才是非贪婪模式。

网上搜索得如下说明:

标准量词修饰的子表达式,在可匹配可不匹配的情况下,总会先尝试进行匹配,称这种方式为匹配优先,或者贪婪模式。此前介绍的一些量词,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配优先的。
一些NFA正则引擎支持忽略优先量词,也就是在标准量词后加一个“?”,此时,在可匹配可不匹配的情况下,总会先忽略匹配,只有在由忽略优先量词修饰的子表达式,必须进行匹配才能使整个表达式匹配成功时,才会进行匹配,称这种方式为忽略优先,或者非贪婪模式。忽略优先量词包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

显然“*?”的组合是非贪婪模式,猜想正确,原来如此啊。

Python 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
总结python中pass的作用
Feb 27 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
如何在Python 游戏中模拟引力
Mar 27 Python
详解Python调用系统命令的六种方法
Jan 28 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 #Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 #Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 #Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 #Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 #Python
解析Python3中的Import
Oct 13 #Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 #Python
You might like
PHP中创建并处理图象
2006/10/09 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
django实现用户登陆功能详解
2017/12/11 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Python如何对XML 解析
2020/06/28 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
New delete 与malloc free 的联系与区别
2013/02/04 面试题
医科大学生的自我评价
2013/12/04 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
求职个人评价范文
2014/04/09 职场文书
户籍证明书标准模板
2014/09/10 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
客房服务员岗位职责
2015/02/09 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android
5个实用的JavaScript新特性
2022/06/16 Javascript
MySQL新手入门进阶语句汇总
2022/09/23 MySQL