python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
作者:两步一脚印 发布时间:2022-07-08 06:45:02
本文实例讲述了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,}?”、“??”、“*?”和“+?”。
显然“*?”的组合是非贪婪模式,猜想正确,原来如此啊。
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
希望本文所述对大家Python程序设计有所帮助。
来源:https://blog.csdn.net/haoxizh/article/details/44648069
猜你喜欢
- 1.概述pyecharts 是百度开源的,适用于数据可视化的工具,配置灵活,展示图表相对美观,顺滑。2.安装python3环境下的安装:pi
- 写了个多层感知器,用bp梯度下降更新,拟合正弦曲线,效果凑合。# -*- coding: utf-8 -*-import numpy as
- 学过 Python 的朋友应该都知道 f-strings 是用来非常方便的格式化输出的,觉得它的使用方法无外乎就是 print(f'
- TihuanWords.txt文档格式注意:同一行的词用单个空格隔开,每行第一个词为同行词的替换词。年休假 年假 年休究竟 到底回家场景 我
- 本文实例讲述了Python中文分词工具之结巴分词用法。分享给大家供大家参考,具体如下:结巴分词工具的安装及基本用法,前面的文章《Python
- 安装 php首先安装 php 的压缩包,目前下载地址解压文件到这个路径下:D:\Program Files\php-7.3.5(自行选择合适
- 前言随时随地发现新鲜事!微博带你欣赏世界上每一个精彩瞬间,了解每一个幕后故事。分享你想表达的,让全世界都能听到你的心声!今天我们通过pyth
- 本节笔者主将要介绍Active Server Page的另一对象Response,Response对象的作用是在向浏览器发送数据。将Resp
- 前言这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公
- Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的
- 学习Python的人都知道数组是最常用的的数据类型,为了保证程序的正确性,需要调试程序。因此,需要在程序中控制台中打印数组的全部元素,如果数
- 一、pandas的统计分析1、关于pandas 的数值统计(统计detail 中的 单价的相关指标)import pandas as pd#
- 这篇文章主要介绍了postman和python mock测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 今天为大家介绍一下python中与class 相关的知识……获取对象的类名python是一门面向对象的语言,对于一切接对象的pyt
- django创建自定义模板处理器:一、需求来源:在django开发中,页面是通过template(模板)进行渲染的,对于一些数据,可以通过{
- 如何向客户端推送“出错信息”?下面是推送代码:服务器端:on error resume nextconn=se
- 上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫
- 导言到目前为止的讨论编辑DataList的教程里,没有包含任何验证用户的输入,即使是用户非法输入— 遗漏了product的name或者负的p
- 方法一:简单,得不到参数,只有一个虚拟路径 代码如下:GetUrl =request("url") 例如:http://
- <%Function BytesToBstr(body,Cset)dim objstreamset&n