贪婪匹配和非贪婪匹配是正则表达式中两种常见的匹配模式。它们决定了正则表达式在匹配过程中的行为,即尽可能多地匹配字符还是尽量少地匹配字符。

贪婪匹配(Greedy Matching)
匹配尽可能多的字符。例如,对于正则表达式a.*b,它会匹配从第一个"a"开始到最后一个"b"之间的所有字符。这是因为.*表示匹配任意数量的任意字符,而默认情况下它是贪婪的,会尽可能多地匹配字符。
非贪婪匹配(Non-greedy Matching)
匹配尽可能少的字符。为了实现非贪婪匹配,我们可以在量词后面加上一个问号?。例如,对于正则表达式a.*?b,它会匹配从第一个"a"开始到第一个"b"之间的所有字符。这是因为.*?表示匹配任意数量的任意字符,但只要满足条件就会停止匹配。
应用举例
Python的re库是一个强大的正则表达式操作库,它允许你使用正则表达式在文本中查找匹配项。下面使用Python的re库来演示贪婪匹配和非贪婪匹配的例子.
re.search
search方法是全字符串匹配的,匹配到第一个结果,即返回结果,不再继续;匹配不到结果时,返回的是None,匹配到结果时,返回的是match对象;匹配到结果时,使用match对象的group方法,获取匹配结果。
import re
# 贪婪匹配
text = "aaaabaaab"
match = re.search("a.*b", text)
print('贪婪匹配',match.group())
# 非贪婪匹配
match2 = re.search("a.*?b", text)
print('非贪婪匹配',match2.group())
输出结果如下:
re.findall
findall是查找字符串中所有可匹配的,并将匹配结果以列表的形式返回。如果匹配不到,则返回一个空列表。
import re
text = "aaaabaaab"
match3 = re.findall("a.*b", text)
print('贪婪匹配',match3)
# 非贪婪匹配
match4 = re.findall("a.*?b", text)
print('非贪婪匹配',match4)
输出结果如下:
总结下来,贪婪匹配和非贪婪匹配是正则表达式中常用的匹配模式,贪婪匹配会尽可能多地匹配字符,而非贪婪匹配则会尽量少地匹配字符。