Desde mi entender,de búsqueda hacia atrás imposible con una referencia inversa
(.)(?<!\1)
nunca debe coincidir. En realidad, php's preg_replace
incluso se niega a compilar esto y también lo hace ruby's gsub
. El módulo de Python re
parece tener una opinión diferente sin embargo:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
Resultado:
(x)AAAA(A)(y)BBB(B)(z)
Puede alguien dar una explicación razonable para este comportamiento?
actualización
Este comportamiento parece ser a limitation en el módulo re
. El módulo alternativa regex
parece manejar grupos en afirmaciones correctamente:
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)
Tenga en cuenta que a diferencia de pcre
, regex
permite también lookbehinds de ancho variable:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
Finalmente, regex
va a ser incluido en la norma biblioteca, como se menciona en PEP 411.
Está a juego como si Usaste '(.) (?! \ 1)'. – FakeRainBrigand