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

Z mojego zrozumienia

<code>(.)(?<!\1)
</code>

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

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

Wynik:

<code>(x)AAAA(A)(y)BBB(B)(z)
</code>

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

Aktualizacja

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

<code>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)
</code>

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

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

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

questionAnswers(1)

yourAnswerToTheQuestion