Python正则表达式(part3):如何区分贪婪与非贪婪模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计654个文字,预计阅读时间需要3分钟。
文章目录+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式转换为非贪婪模式+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式:默认情况,在整个表达式匹配成功的前提下,尽可能多地匹配内容。
文章目录
- 贪婪模式和非贪婪模式
- 定义
- 贪婪模式转换为非贪婪模式
贪婪模式和非贪婪模式
定义
贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能多的匹配。
非贪婪模式(懒惰模式): 在整个表达式匹配成功的前提下,尽可能少的匹配。
贪婪模式转换为非贪婪模式
在匹配重复元字符后加 ?号即可:
贪婪
非贪婪
*
*?
+
+?
?
??
{m,n}
{m,n}?
例子1(贪婪模式)
In: re.findall(r'ab?', "abbbbbbbbbc")Out: ['ab']
In: re.findall(r'ab{2,5}', "abbbbbbbbbc")
Out: ['abbbbb']
像上面这个例子所呈现的那样,表示匹配0次或1次,但是我们的程序,帮我们尽量多的匹配,直接匹配了1次,输出。而则是匹配2~5次的,我们的程序同样帮我们尽量多的匹配,直接匹配了5次,输出。这种匹配模式,就是贪婪模式.
那么我们怎样从贪婪模式变成不贪婪模式呢? 直接在重复元字符后加.
例子2(贪婪模式与非贪婪模式)
In: re.findall(r'\(.+\)',"(abcd)efgh(higkrf)")#贪婪模式Out: ['(abcd)efgh(higkrf)']
In: re.findall(r'\(.+?\)',"(abcd)efgh(higkrf)") #非贪婪模式
Out: ['(abcd)', '(higkrf)']
这个例子中被小括号括住的内容有哪些呢?有、、
如果用贪婪模式则会全部匹配出来;而如果用非贪婪模式,匹配出和。
这是因为在python中,遇到第一个时,虽然符合匹配要求,但是在贪婪模式之下,py也可认为它是从而继续向后匹配(更多的匹配);而在非贪婪模式下,在满足正则表达式规则的前提下,遇到第一个时,py则会直接将括号中内容,作为被匹配对象,放入结果列表中。
本文共计654个文字,预计阅读时间需要3分钟。
文章目录+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式转换为非贪婪模式+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式:默认情况,在整个表达式匹配成功的前提下,尽可能多地匹配内容。
文章目录
- 贪婪模式和非贪婪模式
- 定义
- 贪婪模式转换为非贪婪模式
贪婪模式和非贪婪模式
定义
贪婪模式: 默认情况,在整个表达式匹配成功的前提下,尽可能多的匹配。
非贪婪模式(懒惰模式): 在整个表达式匹配成功的前提下,尽可能少的匹配。
贪婪模式转换为非贪婪模式
在匹配重复元字符后加 ?号即可:
贪婪
非贪婪
*
*?
+
+?
?
??
{m,n}
{m,n}?
例子1(贪婪模式)
In: re.findall(r'ab?', "abbbbbbbbbc")Out: ['ab']
In: re.findall(r'ab{2,5}', "abbbbbbbbbc")
Out: ['abbbbb']
像上面这个例子所呈现的那样,表示匹配0次或1次,但是我们的程序,帮我们尽量多的匹配,直接匹配了1次,输出。而则是匹配2~5次的,我们的程序同样帮我们尽量多的匹配,直接匹配了5次,输出。这种匹配模式,就是贪婪模式.
那么我们怎样从贪婪模式变成不贪婪模式呢? 直接在重复元字符后加.
例子2(贪婪模式与非贪婪模式)
In: re.findall(r'\(.+\)',"(abcd)efgh(higkrf)")#贪婪模式Out: ['(abcd)efgh(higkrf)']
In: re.findall(r'\(.+?\)',"(abcd)efgh(higkrf)") #非贪婪模式
Out: ['(abcd)', '(higkrf)']
这个例子中被小括号括住的内容有哪些呢?有、、
如果用贪婪模式则会全部匹配出来;而如果用非贪婪模式,匹配出和。
这是因为在python中,遇到第一个时,虽然符合匹配要求,但是在贪婪模式之下,py也可认为它是从而继续向后匹配(更多的匹配);而在非贪婪模式下,在满足正则表达式规则的前提下,遇到第一个时,py则会直接将括号中内容,作为被匹配对象,放入结果列表中。

