为什么在这个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?请注意,这将是另一个问题;)