为什么会有贪婪与非贪婪模式呢?我们先来回顾一下正则中表示数量词的规则(前面的正则规则表中 有):
- * : 0次到多次
- + : 1次到多次
- ? : 0次到1次
- {m} : m次
- - {m,n} : m至n次
- {,n} : 0至n次
- {m,} : m至多次
{m,n} 可以等价表示 * , + , ? 这 3 种数量词:
- : {0,}
- : {1,}
- ? : {,1}或{0,1}(部分编程语言只支持)
数量词 + 和 * 并没有我们想象的那么简单,测试一下:
>>> import re
>>> re.findall('\d+', '123456abc')
['123456']
>>> re.findall('\d*', '123456abc')
['123456', '', '', '', '']
可以看到 号额外匹配了4个空字符串,通过https://regex101.com/可以清楚的看到这4个空字符串
(粉红色竖线)所在的位置。
表示0次到多次,由于可以匹配0次所以匹配到了空字符串。结果是否令你有些难以理解,那么我们接
下来看看贪婪模式和非贪婪模式具体的概念。
贪婪模式就是尽可能匹配更多的字符,非贪婪模式则是尽可能匹配最少的字符,这两种匹配模式会产生
不同的匹配结果。