据我了解,
(.)(?<!\1)
这应该永远不会匹配。实际上,PHP的preg_replace
甚至拒绝编译它,Ruby的gsub
也是如此。但是Python的re
模块似乎有不同的看法:
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)
最终,正则表达式将会被包含在标准库中,如PEP 411所述。
(.)(?!\1)
。 - Brigand