從我的理解,不可能回顧後用反向引用
(.)(?<!\1)
不應該相匹配。實際上,php的preg_replace
甚至拒絕編譯這個,ruby的gsub
也是如此。蟒蛇re
模塊似乎有,雖然不同的看法:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
結果:
(x)AAAA(A)(y)BBB(B)(z)
任何人都可以提供這種行爲一個合理的解釋?
更新
這種行爲似乎是re
模塊中a limitation。替代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
還允許可變寬度lookbehinds:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
最終,regex
將要被包括在標準庫,如PEP 411中所述。
它匹配好像你使用了'(。)(?!\ 1)'。 – FakeRainBrigand 2012-04-23 10:56:08