liguodeboke

非贪婪匹配

将尽可能少的匹配内容,当?出现在其他的重复次数后面时会将贪婪模式改为非贪婪模式。

?

abc.*?

abc.+?


非贪婪匹配:尽可能少的匹配
{n,}?
{,n}?
{n,m}?
*? # *号表示 *号前面的字符出现0--无数个 ?号表示最少匹配
+?   # +号表示 +号前面的字符出现1--无数个
?? # ??表示0--1个

print(re.findall(r\'ab{0,}\', \'aababbabbb\')) # [\'a\', \'ab\', \'abb\', \'abbb\']
print(re.findall(r\'ab{0,}?\', \'aababbabbb\')) # [\'a\', \'a\', \'a\', \'a\']

print(re.findall(r\'ab{,3}\', \'aababbabbb\')) # [\'a\', \'ab\', \'abb\', \'abbb\']
print(re.findall(r\'ab{,3}?\', \'aababbabbb\')) # [\'a\', \'a\', \'a\', \'a\']

print(re.findall(r\'ab{1,3}\', \'aababbabbb\')) # [\'ab\', \'abb\', \'abbb\']
print(re.findall(r\'ab{1,3}?\', \'aababbabbb\')) # [\'ab\', \'ab\', \'ab\']

print(re.findall(r\'ab*\', \'aababbabbb\')) # [\'a\', \'ab\', \'abb\', \'abbb\']
print(re.findall(r\'ab*?\', \'aababbabbb\')) # [\'a\', \'a\', \'a\', \'a\']

print(re.findall(r\'ab+\', \'aababbabbb\')) # [\'ab\', \'abb\', \'abbb\']
print(re.findall(r\'ab+?\', \'aababbabbb\')) # [\'ab\', \'ab\', \'ab\']

print(re.findall(r\'ab?\', \'aababbabbb\')) # [\'a\', \'ab\', \'ab\', \'ab\']
print(re.findall(r\'ab??\', \'aababbabbb\')) # [\'a\', \'a\', \'a\', \'a\']


print(re.findall(r\'\', \'\')) # [\'\']
print(re.findall(r\'a{0}\', \'a\')) # [\'\', \'\']

# 非贪婪匹配结合单个匹配结果是没有任何意义的
print(re.findall(r\'b*?\', \'bbbbbbbb\'))
print(re.findall(r\'(?:ab)*?\', \'bbbbbbbb\'))

# 非贪婪匹配的应用场景,正则一定会有首尾标识,中间匹配的结果会有非贪婪匹配的语法
s = \'<a>abc</a><a></a>\'
print(re.findall(r\'<.*>\', s)) # [\'<a>abc</a><a></a>\']
print(re.findall(r\'<.*?>\', s)) # [\'<a>\', \'</a>\', \'<a>\', \'</a>\']

print(re.findall(r\'<a>(.*)</a>\', s)) # [\'abc</a><a>\']
print(re.findall(r\'<a>(.*?)</a>\', s)) # [\'abc\', \'\']

分类:

技术点:

相关文章: