gpt4 book ai didi

Python正则表达式教程之三:贪婪/非贪婪特性

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python正则表达式教程之三:贪婪/非贪婪特性由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。  。

贪婪 。

默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就是在多种长度的匹配字符串中,选择较长的那一个。例如,如下正则表达式本意是选出人物所说的话,但是却由于“贪婪”特性,出现了匹配不当:

?
1
2
3
>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r '"(.*)"' , sentence)
[ 'why?" and I say "I don\'t know' ]

再比如,如下的几个例子都说明了正则表达式“贪婪”的特性:

?
1
2
3
4
5
6
>>> re.findall( 'hi*' , 'hiiiii' )
[ 'hiiiii' ]
>>> re.findall( 'hi{2,}' , 'hiiiii' )
[ 'hiiiii' ]
>>> re.findall( 'hi{1,3}' , 'hiiiii' )
[ 'hiii' ]

非贪婪 。

当我们期望正则表达式“非贪婪”地进行匹配时,需要通过语法明确说明:  。

      {2,5}?    捕获2-5次,但是优先次数少的匹配 。

在这里,问号?可能会有些让人犯晕,因为之前他已经有了自己的含义:前面的匹配出现0次或1次。其实,只要记住,当问号出现在表现不定次数的正则表达式部分之后时,就表示非贪婪匹配。  。

还是上面的那几个例子,用非贪婪匹配,则结果如下:

?
1
2
3
4
5
6
>>> re.findall( 'hi*?' , 'hiiiii' )
[ 'h' ]
>>> re.findall( 'hi{2,}?' , 'hiiiii' )
[ 'hii' ]
>>> re.findall( 'hi{1,3}?' , 'hiiiii' )
[ 'hi' ]

另外一个例子中,使用非贪婪匹配,结果如下:

?
1
2
3
>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r '"(.*?)"' , sentence)
[ 'why?' , "I don't know" ]

捕获与非贪婪 。

严格来说,这一部分并不是非贪婪特性。但是由于其行为与非贪婪类似,所以为了方便记忆,就将其放在一起了。  。

      (?=abc) 捕获,但不消耗字符,且匹配abc 。

      (?!abc) 捕获,不消耗,且不匹配abc 。

在正则表达式匹配的过程中,其实存在“消耗字符”的过程,也就是说,一旦一个字符在匹配过程中被检索(消耗)过,后面的匹配就不会再检索这一字符了。  。

知道这个特性有什么用呢?还是用例子说明。比如,我们想找出字符串中出现过1次以上的单词:

?
1
2
3
>>> sentence = "Oh what a day, what a lovely day!"
>>> re.findall(r '\b(\w+)\b.*\b\1\b' , sentence)
[ 'what' ]

这样的正则表达式显然无法完成任务。为什么呢?原因就是,在第一个(\w+)匹配到what,并且其后的\1也匹配到第二个what的时候,“Oh what a day, what”这一段子串都已经被正则表达式消耗了,所以之后的匹配,将直接从第二个what之后开始。自然地,这里只能找出一个出现了两次的单词。  。

那么解决方案,就和上面提到的(?=abc)语法相关了。这样的语法可以在分组匹配的同时,不消耗字符串!所以,正确的书写方式应该是:

?
1
2
>>> re.findall(r '\b(\w+)\b(?=.*\b\1\b)' , sentence)
[ 'what' , 'a' , 'day' ]

如果我们需要匹配一个至少包含两个不同字母的单词,则可以使用(?!abc)的语法:

?
1
2
3
>>> re.search(r '([a-z]).*(?!\1)[a-z]' , 'aa' , re.IGNORECASE)
>>> re.search(r '([a-z]).*(?!\1)[a-z]' , 'ab' , re.IGNORECASE)
<_sre.SRE_Match object ; span = ( 0 , 2 ), match = 'ab' >

总结 。

以上就是Python正则表达式中关于贪婪的全部内容了,希望本文的内容对大家的学习或者使用python能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下Python正则表达式re模块的一些API的用法,请继续关注我.

原文链接:http://blog.guoyb.com/2017/03/01/python-regex-3/ 。

最后此篇关于Python正则表达式教程之三:贪婪/非贪婪特性的文章就讲到这里了,如果你想了解更多关于Python正则表达式教程之三:贪婪/非贪婪特性的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com