这看起来确实像是Python
re模块中的一个限制(我从Microsoft的支持电话中学到的一种“错误”的好说法)。
我猜想这与以下事实有关:Python不支持可变长度的后向断言,但是它不够聪明,无法确定
1始终是固定长度的。我不能说为什么在编译正则表达式时不抱怨这一点。
很有趣:
>>> print (re.sub(r'.(?<! )', r'(g<0>)', test))(x)(A)(A)(A)(A)(A)(y)(B)(B)(B)(B)(z)>>>>>> re.compile(r'(.*)(?<!1)') # This should trigger an error but doesn't!<_sre.SRE_Pattern object at 0x00000000026A89C0>
因此最好不要在Python的后置断言中使用反向引用。正向后看并不会好得多(它在这里也像正向前向相匹配):
>>> print (re.sub(r'(.)(?<=1)', r'(g<0>)', test))x(A)(A)(A)(A)Ay(B)(B)(B)Bz
而且我什至无法猜测这里发生了什么:
>>> print (re.sub(r'(.+)(?<=1)', r'(g<0>)', test))x(AA)(A)(A)Ay(BB)(B)Bz



