python贪婪和非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪则相反,总是尝试匹配尽可能少的字符。

在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

1
2
3
4
5
6
7
8
import re

# 匹配多个数字
result = re.match(r"aaa(\d+)", "aaa123456")
if result:
    print(result.group())
else:
    print("匹配失败~!")

匹配的结果:

1
aaa123456

正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“\d+”会从字符串的启始处抓取满足模式的最长数字字符,于是抓取到了“aaa123456”,而不是只抓取“aaa1”,

image-20180619095456893

解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好。

1
2
3
4
5
6
# 匹配多个数字
result = re.match(r"aaa(\d+?)", "aaa123456")
if result:
    print(result.group())
else:
    print("匹配失败~!")

运行结果:

1
aaa1

image-20180619095600620

image-20180619095134047