据我了解,
(.)(?<!\1)
永远不应该匹配。实际上,phppreg_replace
甚至拒绝编译它,ruby 也是如此gsub
。不过,pythonre
模块似乎有不同的看法:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
结果:
(x)AAAA(A)(y)BBB(B)(z)
任何人都可以为这种行为提供合理的解释吗?
更新
此行为似乎是模块中的一个限制。re
替代regex
模块似乎可以正确处理断言中的组:
import regex
test = 'xAAAAAyBBBBz'
print (regex.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
## xAAAAAyBBBBz
print (regex.sub(r'(.)(.)(?<!\1)', r'(\g<0>)', test))
## (xA)AAA(Ay)BBB(Bz)
请注意,与, 不同的是pcre
,regex
它还允许可变宽度的后视:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
最终,regex
将被包含在标准库中,如PEP 411中所述。