4. 贪婪匹配和非贪婪匹配

贪婪匹配(默认)

默认的 *+?{m,n} 数量限定符都是 贪婪的,所谓贪婪就是在整个表达式匹配成功的前提下,尽可能多的匹配。

非贪婪匹配

在原有的 *+?{m,n} 数量限定符的后面加一个问号 ?,则为非贪婪的匹配方式。所谓非贪婪就是尽可能少的匹配。

非贪婪匹配的 数量限定符表示为: *?+???{m,n}?

示例

先准备一个字符串 s3,如下:

>>> import re
>>> s3 = '<h1>咏鹅</h1><p>鹅,鹅,鹅,曲项向天歌。</p><p>白毛浮绿水,红掌拨清波。</p>'

使用贪婪匹配方式进行匹配

>>> re.findall(r'<p>.*</p>', s3)
['<p>鹅,鹅,鹅,曲项向天歌。</p><p>白毛浮绿水,红掌拨清波。</p>']

可见贪婪匹配方式 只匹配到一个结果为:'<p>鹅,鹅,鹅,曲项向天歌。</p><p>白毛浮绿水,红掌拨清波。</p>'

下面再使用非贪婪匹配方式进行匹配

>>> re.findall(r'<p>.*?</p>', s3)
['<p>鹅,鹅,鹅,曲项向天歌。</p>', '<p>白毛浮绿水,红掌拨清波。</p>']

可见非贪婪匹配方式 匹配到了两个结果为:'<p>鹅,鹅,鹅,曲项向天歌。</p>''<p>白毛浮绿水,红掌拨清波。</p>'