Imposible mirar detrás de una referencia

Desde mi entendimiento,

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

nunca debe coincidir En realidad, phppreg_replace incluso se niega a compilar esto y también lo hace Rubygsub. La pitonre módulo parece tener una opinión diferente sin embargo:

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

Resultado:

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

¿Puede alguien proporcionar una explicación razonable para este comportamiento?

Actualizar

Este comportamiento parece seruna limitación en elre módulo. La alternativaregex El módulo parece manejar grupos en aserciones correctamente:

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

Tenga en cuenta que a diferenciapcre, regex También permite mirar detrás de ancho variable:

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

Finalmente,regex se incluirá en la biblioteca estándar, como se menciona enPEP 411.

Respuestas a la pregunta(1)

Su respuesta a la pregunta