Python正则表达式(part3):如何区分贪婪与非贪婪模式?

2026-06-10 22:181阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计654个文字,预计阅读时间需要3分钟。

Python正则表达式(part3):如何区分贪婪与非贪婪模式?

文章目录+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式转换为非贪婪模式+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式:默认情况,在整个表达式匹配成功的前提下,尽可能多地匹配内容。


文章目录

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


贪婪模式和非贪婪模式

定义

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

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

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

贪婪

非贪婪

Python正则表达式(part3):如何区分贪婪与非贪婪模式?

*

*?

+

+?

?

??

{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分钟。

Python正则表达式(part3):如何区分贪婪与非贪婪模式?

文章目录+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式转换为非贪婪模式+ 贪婪模式与非贪婪模式+ 定义+ 贪婪模式:默认情况,在整个表达式匹配成功的前提下,尽可能多地匹配内容。


文章目录

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


贪婪模式和非贪婪模式

定义

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

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

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

贪婪

非贪婪

Python正则表达式(part3):如何区分贪婪与非贪婪模式?

*

*?

+

+?

?

??

{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则会直接将括号中内容,作为被匹配对象,放入结果列表中。