理解贪婪与非贪婪

如下代码,期待匹配的数字1234567,实际匹配的是数字7

1
2
3
4

# 输出:7
print(re.match(r'^He.*(\d+).*Demo$', 'Hello 1234567 World_This is Regex Demo').group(1))

在贪婪匹配下,.*或匹配尽可能多的字符。正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,因此.*就尽可能匹配多的字符。

在做匹配时,字符串中间尽量使用非贪婪匹配,也就是用.*?来代替.*以免出现匹配结果缺失的情况:

1
2
3
4

# 输出:1234567
print(re.match(r'^He.*?(\d+).*Demo$', 'Hello 1234567 World_This is Regex Demo').group(1))

.*?如果在字符串结尾,就可能匹配不到任何内容了,因为他会匹配尽可能少的字符。

1
2
3
4
5
6

content = 'https://weibo.com/comment/kEraCN'

print('result1', re.match('https.*?comment/(.*)', content).group(1))
print('result2', re.match('https.*?comment/(.*?)', content).group(1))