学科分类
目录

贪婪匹配

正则表达式中有两种匹配方式:贪婪匹配和非贪婪匹配。所谓贪婪匹配,即在条件满足的情况下,尽量多地进行匹配;反之若尽量少地进行匹配,则为非贪婪匹配。Python中正则表达式的默认匹配方式为贪婪匹配。

以字符串“And slowly read,and dream of the soft look”为例,假设使用正则表达式“and\s.*”对该字符串进行匹配,示例如下:

import re
words = 'And slowly read,and dream of the soft look'
result = re.search(r'and\s.*', words)
print(result.group())

运行代码,结果如下所示:

and dream of the soft look

正则表达式“and\s.”的含义为:匹配以字符串and开头,之后紧接一个空格,空格后有零个或多个字符的字符串。观察匹配结果,正则表达式中的“.”匹配了从“and ”到字符串words结尾的所有字符,这样的匹配便是贪婪匹配。

贪婪匹配方式也称为匹配优先,即在可匹配可不匹配时,优先尝试匹配;非贪婪匹配方式也称忽略优先,即在可匹配可不匹配时,优先尝试忽略。这两种匹配方式总是体现在重复匹配中,重复匹配中使用的元字符(“?”、“”、“+”、“{}”)默认为匹配优先,但当其与“?”搭配,即以“??”、“?”、“+?”、“{}?”这些形式出现时,则为忽略优先。

若使用非贪婪方式,即使用正则表达式“and\s.*?”进行匹配,示例如下:

import re
words = 'And slowly read,and dream of the soft look'
result = re.search(r'and\s.*?', words)
print(result.group())

运行代码,结果如下所示:

and 

观察匹配结果,正则表达式中的“.*”匹配了零个字符。

类似地,若使用“and\s.+”与“and\s.+?”匹配字符串s,则匹配结果分别如下所示。

print(re.search(r'and\s.+', words).group())      # 贪婪匹配
print(re.search(r'and\s.+?', words).group())    # 非贪婪匹配

运行代码,结果如下所示:

and dream of the soft look
and d

观察以上匹配结果,可知在贪婪匹配方式中,表达式匹配了尽量多的字符;在非贪婪匹配方式中,表达式仅匹配了一个字符。

点击此处
隐藏目录