Niemożliwe patrzenie w tył z referencją wsteczną

Z mojego zrozumienia

(.)(?<!\1)

nigdy nie powinien pasować. Właściwie to phppreg_replace&nbsp;nawet nie chce tego skompilować, podobnie jak rubygsub. Pythonre&nbsp;moduł wydaje się mieć inną opinię:

import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))

Wynik:

(x)AAAA(A)(y)BBB(B)(z)

Czy ktoś może przedstawić rozsądne wyjaśnienie tego zachowania?

Aktualizacja

To zachowanie wydaje się byćograniczenie&nbsp;wre&nbsp;moduł. Alternatywaregex&nbsp;moduł wydaje się poprawnie obsługiwać grupy w asercjach:

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)

Zauważ, że w przeciwieństwie dopcre, regex&nbsp;umożliwia również śledzenie o zmiennej szerokości:

print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)

Ostatecznie,regex&nbsp;zostanie uwzględniona w standardowej bibliotece, jak wspomniano wPEP 411.