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?
ActualizarEste 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.