文章目录 贪婪模式和非贪婪模式 定义 贪婪模式转换为非贪婪模式 贪婪模式和非贪婪模式 定义 贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能
文章目录
- 贪婪模式和非贪婪模式
- 定义
- 贪婪模式转换为非贪婪模式
贪婪模式和非贪婪模式
定义
贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能多的匹配。
非贪婪模式(懒惰模式): 在整个表达式匹配成功的前提下,尽可能少的匹配。
贪婪模式转换为非贪婪模式
在匹配重复元字符后加 ?号即可:
贪婪
非贪婪
*
*?
+
+?
?
??
{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则会直接将括号中内容,作为被匹配对象,放入结果列表中。