Unmögliches Aussehen hinter einem Rückverweis

Meinem Verständnis nach,

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

sollte nie passen. Eigentlich php'spreg_replace weigert sich sogar, dies zu kompilieren, und Rubys auchgsub. Die Pythonre Modul scheint jedoch eine andere Meinung zu haben:

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

Ergebnis:

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

Kann jemand eine vernünftige Erklärung für dieses Verhalten liefern?

Aktualisieren

Dieses Verhalten scheint zu seineine Einschränkung in demre Modul. Die Alternativeregex Modul scheint Gruppen in Zusicherungen korrekt zu behandeln:

<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>

Beachten Sie, dass im Gegensatz zupcre, regex ermöglicht auch Lookbehinds mit variabler Breite:

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

Schließlich,regex wird in die Standardbibliothek aufgenommen, wie inPEP 411.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage