为什么在这个Python正则表达式示例中有一个额外的结果交给我?

时间:2011-03-31 16:05:44

标签: python regex

代码:

re.findall('(/\d\d\d\d)?','/2000')

结果:

  

['/ 2000','']

代码:

re.findall('/\d\d\d\d?','/2000')

结果:

  

[ '/ 2000']

为什么第一个例子中会返回额外的''? 我正在使用django url配置的第一个例子,有没有办法可以阻止''的匹配?

3 个答案:

答案 0 :(得分:3)

因为使用括号定义了一个组,然后使用?,您要求重复0到1组。因此空字符串和/2000都匹配。

答案 1 :(得分:1)

运算符?将匹配前面表达式的0或1次重​​复,在第一种情况下前面的表达式是(/\d\d\d\d),而在第二种情况下是最后一个\d

因此第一种情况是空字符串""将匹配,因为它包含表达式(/\d\d\d\d)

的零重复

答案 2 :(得分:0)

以下是正在发生的事情:正则表达式引擎以其指针在目标字符串中的第一个字符之前开始。它贪婪地使用整个字符串并将匹配结果放在第一个列表元素中。这使内部指针位于字符串的末尾。但由于正则表达式模式可以匹配虚无,它也成功匹配字符串末尾的位置,因此,列表中有两个元素。