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的词法分析与语法分析
May 18 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python3如何将docx转换成pdf文件
Mar 23 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
Django基础知识与基本应用入门教程
Jul 20 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
python实现过滤敏感词
May 08 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
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
python监控文件并且发送告警邮件
2018/06/21 Python
在python 中实现运行多条shell命令
2019/01/07 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
Django框架 信号调度原理解析
2019/09/04 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
三个python爬虫项目实例代码
2019/12/28 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
小学运动会表扬稿
2014/01/19 职场文书
机械工程师岗位职责
2014/06/16 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
销售口号霸气押韵
2015/12/24 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers