python 正则表达式贪婪模式与非贪婪模式

Python中的正则表达式(Regex匹配,贪婪匹配Greedy Matching) 正则表达式(regex)是描述一组字符串的模式匹配过程测试给定字符串是否与模式匹配,也可以修改字符串.例如,通过替换子串或将其拆分为子串•正则表达式是一种功能强大的编程工具,广泛用于计算/文本处理(例如)在Perl、Tcl/Tk、Java、grep、sed、awk、vi、emacs、lex中找到但请注意,regex语法各不相同•许多应用-一些随机示例:从一组网页中删除html;从程序中提取注释块(例如构建文档);检查文档中的双字(“the”、“here here”) 阅读详情

之前未接触过正则表达式,今日看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 中的正则表达式是使用贪婪模式进行匹配的。所谓贪婪模式,就是在能够完成匹配的前提下,尽可能地多匹配字符。除了以上两种模式外,Python 还提供了一种懒惰模式,即当第一个匹配到的字符满足条件时,直接返回结果。它们指的是匹配规则中,当有多种匹配方案时,正则表达式会选择怎样的方式来匹配。可以看到,由于使用了贪婪模式,这个正则表达式只匹配了整个 HTML 块,而没有把标签中间的内容作为多个匹配项。Python 正则表达式的贪婪和非贪婪模式十分常用,大家一定要掌握好它们的使用方法。 阅读详情

相关推荐

Python正则表达式贪婪模式和非贪婪模式

正则表达式是一种强大的工具,用于在文本中查找、匹配和处理特定模式的字符串。当使用正则表达式进行匹配时,存在贪婪模式和非贪婪模式两种匹配方式。总结一下,Python正则表达式中的贪婪模式和非贪婪模式提供了不同的匹配方式。贪婪模式会尽可能多地匹配符合条件的字符串,而非贪婪模式会尽可能少地匹配。贪婪模式是指正则表达式默认的匹配方式,它会尽可能多地匹配符合条件的字符串。然而,有时候我们希望匹配的结果更精确,只匹配符合特定条件的最小子串。非贪婪模式在某些场景下非常有用,例如在提取HTML标签中的内容时。

HackQuestR的博客 356

Python正则表达式---贪婪匹配

John 使用了非贪婪匹配,它只匹配到第一个满足条件的 “John” 前面的最小字符串 “my name is John”。通过使用非贪婪匹配,我们可以控制正则表达式尽可能少地匹配字符,从而得到更精确的结果。.* 表示匹配任意数量的任意字符(除换行符外)。贪婪匹配会将尽可能多的字符都作为匹配结果返回。表示非贪婪的匹配任意数量的任意字符。非贪婪匹配会尽可能少地匹配字符以满足匹配规则。如果我们想要匹配 “my” 后面的最小字符串,即。的,它会尽可能多地匹配满足条件的字符。,我们可以使用非贪婪匹配的符号

豫州刺史 1448

贪婪模式和非贪婪模式Python正则表达式中的应用

正则表达式是用于在文本中查找模式的工具,而贪婪模式和非贪婪模式正则表达式中重要的概念。与之相反,非贪婪模式则会尽可能少地匹配字符串中的字符,以满足整个正则表达式的匹配条件。输出结果为:‘python, python is a good languag’,可以看到匹配到的字符包含了整个字符串中最后一个’python’。贪婪模式是默认的正则表达式匹配模式。以上是关于Python正则表达式贪婪模式和非贪婪模式的介绍,希望对大家学习正则表达式有所帮助。贪婪模式和非贪婪模式Python正则表达式中的应用。

. 780

正则表达式和re模块

目录 正则表达式 字符组 ​​​​​​ 元字符 量词 . ^ $ * + ? { } 字符集[][^] 分组 ()与 或 |[^] 转义符 \ 贪婪匹配 re模块  re模块下的常用方法 注意 1、findall的优先级查询 2、split的优先级查询 扩展 1、匹配标签 2、匹配整数 3、数字匹配 正则表达式 字符组 ​​​​​​ 在同一个位置可能出现...

1018

正则表达式re中的贪心算法和非贪心算法 在python中的应用

之前写了一篇有关正则表达式的文章,主要是介绍了正则表达式中通配符 转义字符 字符集 选择符和子模式 可选项和重复子模式 字符串的开始和结尾 ,有兴趣的可以查看博客内容。 此文章主要内容将要介绍re中的贪心和非贪心算法: 贪心: 使用 .* 匹配字符串 其中标点 . 表示通配符,可以用来匹配除换行符之外的任意符号,* 为重复子模式,允许模式重复0次或者多次; 贪心算法将会按照尽

Winterto1990的博客 6992

Python3正则表达式贪婪模式与非贪婪模式

前言 正则表达式是一个特殊字符序列,主要是帮助用户检索一个字符串是否与某种模式匹配或者在txt文档中检测匹配的字符串序列,然后将删除或者替换,在日常变种中我们也经常会进行字符查找和替换,这些的实现就是通过正则表达式提供的。关于正则表达式的使用,可以参考https://blog.csdn.net/m0_37852369/article/details/78829174和https://blog.c...

Xinyu_cheng的博客 947

Python3正则表达式(三)贪婪模式与非贪婪模式

在前面两篇文章当中已经介绍了python正则表达式的基本运用,接下来总结一下正则表达式中的贪婪模式和非贪婪模式。 一、概念 首先举个例子: example = "abbbbbbc" pattern = re.compile("ab+") 贪

狗蛋的学习笔记 2万+

盘点Python正则表达式中的贪婪模式和非贪婪模式

点击上方“Python共享之家”,进行关注回复“资源”即可获赠Python学习资料今日鸡汤潮落夜江斜月里,两三星火是瓜洲。大家好,我是我是皮皮。一、前言前几天在Python最强王者交流群有...

pdcfighting的博客 391

正则表达式贪婪模式和非贪婪模式Python3.6)

一、概念 贪婪模式正则表达式一般趋于最大长度匹配,也就是所谓的贪婪匹配。 非贪婪模式:在整个表达式成功的前提下,尽可能少的匹配。 举个栗子: >>> content = "abbbbbbbbbbbbbbbsa" >>> res = re.compile("ab+") >>> res.findall(content) #贪婪模式 ['abbbb...

Cystal_ll的博客 685

python-正则表达式的转义以及贪婪模式和非贪婪模式

python正则表达式的转义以及贪婪模式和非贪婪模式

HideAsn的博客 397

Python 正则表达式贪婪模式

贪婪模式也就是我们使用 .*匹配任意字符时会尽可能长地向后匹配,如果我们想阻止这种贪婪模式,需要加个问号,尽可能少地匹配,如下例子: In [1]: import re In [2]: html = '<h1> hello world </h1>' In [3]: re.findall(r'<.*>', html) # 贪婪模式...

weixin_30335575的博客 134

python正则表达式贪婪模式

?表示非贪婪模式,例子: 提取首次出现的两个b之间的字符串 正确代码: import re line = 'boaabby123' regex_str = ".*?(b.*?b).*" #regex_str 匹配规则 # ^ 表示以某个字符串开头 # . 表示任意字符 # * 表示这个字符可以重复任意多次 # $ 表示以某个字符结尾 # ? 表示以非贪婪模式匹配 match_str = r...

zh54b5n64vn64654的博客 590

Python3-正则表达式~贪婪模式与非贪婪模式

import re str1 = r'aa&lt;div&gt;test1&lt;/div&gt;bb&lt;div&gt;test2&lt;/div&gt;cc' str2 = r'aa&lt;div&gt;test1&lt;div&gt;test2&lt;/div&gt;&lt;/div&gt;cc' #贪婪模式 pattern=re.compile(r'&lt;

zbrj12345的博客 587

python正则表达式中的贪婪与非贪婪模式

概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”、“{m,}”、“?”、“*”和“+”。 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括: “{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。 从正则语法的角度

qq_40741808的博客 1223

第11.9节 Python正则表达式贪婪模式和非贪婪模式

在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在《第11.8节 Pytho正则表达式的重复匹配模式及元字符“?”、 “*”、 “+”功能介绍》中的重复匹配模式就是贪婪模式。 什么是贪婪模式呢?就是匹配的时候,在整体匹配的情况下最大可能多的匹配最多的字符。非贪婪模式就是只要在字符串从左往右匹配模式串成功即停止匹配。如模式串“<.*>” 在匹配 字符串'<a> ...

老猿Python 1500

可有可无 正则_python正则表达式--RE模块(转义r 和 \,贪婪模式与非贪婪模式)...

在使用Python循环读取sql语句中的表名和列名的过程中,使用到了正则表达式,这里记录下RE模块的基本用法和示例。正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;...

weixin_33461476的博客 519
上一篇: python3 urllib使用debug输出
下一篇: python3 使用urllib.request模块,关于bytes和string的那些事
两步一脚印
博客等级 码龄12年 5粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值