【发布时间】:2013-05-04 20:42:53
【问题描述】:
考虑以下几点:
>>> import re
>>> a = "first:second"
>>> re.findall("[^:]*", a)
['first', '', 'second', '']
>>> re.sub("[^:]*", r"(\g<0>)", a)
'(first):(second)'
re.sub() 的行为最初更有意义,但我也可以理解re.findall() 的行为。毕竟,您可以匹配 first 和 : 之间仅包含非冒号字符(恰好为零)的空字符串,但为什么 re.sub() 的行为方式不同?
最后一个命令的结果不应该是(first)():(second)()吗?
【问题讨论】:
-
findall的文档说返回空匹配,但sub的文档没有这样说。 -
@VaughnCato
re.sub('.*', 'foo', '')虽然返回'foo'。 -
@VaughnCato 就我个人而言,我不认为这是一个令人满意的解释。为什么空字符串甚至被认为是匹配的?不像其他非比赛之间明显不同,但它也可以被计入上一场比赛。这不是错,但它仍然不是正确的方法。为什么不匹配
:之后的空字符串呢?虽然我认为这里不适合回答这些问题。 -
@StjepanBakrac:它尝试了
first并立即找到了匹配项,然后匹配项在位置 5 重新开始,它只能匹配一个空字符串。引擎将前进到位置 6 并重新开始匹配,发现second等。 -
@StjepanBakrac:问题是引擎不会在某个位置开始匹配,如果它已经找到一个匹配开始在相同的位置。因此,您将得到 1 个空字符串。这都是引擎的实现,如果我们不考虑引擎,争论正则表达式实际匹配的内容实际上是没有意义的。