当前位置 : 主页 > 编程语言 > python >

python与正则表达式(part3)--贪婪模式和非贪婪模式

来源:互联网 收集:自由互联 发布时间:2022-06-15
文章目录 ​​贪婪模式和非贪婪模式​​ ​​定义​​ ​​贪婪模式转换为非贪婪模式​​ 贪婪模式和非贪婪模式 定义 贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能


文章目录

  • ​​贪婪模式和非贪婪模式​​
  • ​​定义​​
  • ​​贪婪模式转换为非贪婪模式​​


贪婪模式和非贪婪模式

定义

贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能多的匹配。
非贪婪模式(懒惰模式): 在整个表达式匹配成功的前提下,尽可能少的匹配。

贪婪模式转换为非贪婪模式

在匹配重复元字符后加 ?号即可:

贪婪

非贪婪

*

*?

+

+?

?

??

{m,n}

{m,n}?

例子1(贪婪模式)

In: re.findall(r'ab?', "abbbbbbbbbc")
Out: ['ab']

In: re.findall(r'ab{2,5}', "abbbbbbbbbc")
Out: ['abbbbb']

像上面这个例子所呈现的那样,【ab?】表示匹配0次或1次【b】,但是我们的程序,帮我们尽量多的匹配,直接匹配了1次,输出【ab】。而【ab{2, 5}】则是匹配2~5次的【b】,我们的程序同样帮我们尽量多的匹配,直接匹配了5次,输出【abbbbb】。这种匹配模式,就是贪婪模式.

那么我们怎样从贪婪模式变成不贪婪模式呢? 直接在重复元字符后加【?】.

例子2(贪婪模式与非贪婪模式)

In: re.findall(r'\(.+\)',"(abcd)efgh(higkrf)")#贪婪模式
Out: ['(abcd)efgh(higkrf)']

In: re.findall(r'\(.+?\)',"(abcd)efgh(higkrf)") #非贪婪模式
Out: ['(abcd)', '(higkrf)']

这个例子中被【()】小括号括住的内容有哪些呢?有【(abcd)efgh(higkrf)】、【(abcd)】、【(higkrf)】
如果用贪婪模式则会全部匹配出来;而如果用非贪婪模式,匹配出【(abcd)】和【(higkrf)】。
这是因为在python中,【(】遇到第一个【)】时,虽然符合匹配要求,但是在贪婪模式之下,py也可认为它是【.】从而继续向后匹配(更多的匹配);而在非贪婪模式下,在满足正则表达式规则的前提下,【(】遇到第一个【)】时,py则会直接将括号中内容,作为被匹配对象,放入结果列表中。

上一篇:python与正则表达式(part5)--re模块使用
下一篇:没有了
网友评论