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 相关文章推荐
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
python matlibplot绘制3D图形
Jul 02 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
python如何获取网络数据
Apr 11 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
jQuery创建插件的代码分析
2011/04/14 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
深入理解js promise chain
2016/05/05 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
教你安装python Django(图文)
2013/11/04 Python
python实现simhash算法实例
2014/04/25 Python
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
理解Python垃圾回收机制
2016/02/12 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
python实现超市商品销售管理系统
2019/11/22 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
会计电算化个人自我评价
2013/11/17 职场文书
煤矿安全协议书
2014/08/20 职场文书
调研座谈会发言材料
2014/08/23 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
法院个人总结
2015/03/03 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js