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

为什么在这个Python正则表达式示例中会有一个额外的结果返回给我?,python,regex,Python,Regex,代码: re.findall('(/\d\d\d\d)?','/2000') re.findall('/\d\d\d\d?','/2000') 结果: re.findall('(/\d\d\d\d)?','/2000') re.findall('/\d\d\d\d?','/2000') ['/2000',''] 代码: re.findall('(/\d\d\d\d)?','/2000') re.findall('/\d\d\d\d?','/2000') 结果: re.findall(

代码:

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

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

代码:

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

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

为什么在第一个示例中会返回额外的“”?
我正在使用django url配置的第一个示例,是否有一种方法可以防止“”的匹配

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

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


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

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

但“/2000”中没有空字符串:p在
/2000
中有无限多的空字符串。每个角色之间都有一个,每个角色之间都有一个,以此类推。在字符串的开头和结尾也有几个@兔子:是的,每个字符串中都有一个空字符串,就像空集合是其他集合的子集一样。在交互提示下,在“foo”中尝试
。正如Dave所说,每个字符串中都有一个空字符串,非常有哲理:),无论如何,请尝试
re.findall(“(/\d\d\d\d)?”,“/20009”)
注意在匹配字符串的末尾添加了9,它将为您提供两个emtpy字符串作为匹配,由于它将在
9
之前匹配一次
,在字符串的末尾匹配一次,我认为最后一个匹配在字符串的末尾,因为
/0
代表C中字符*数组的结尾,希望现在清楚:)您到底想要匹配什么URL?请注意,这将是另一个问题;)