Lookbehind impossível com uma backreference
Do meu entendimento,
(.)(?<!\1)
nunca deve corresponder. Na verdade, phppreg_replace
ainda se recusa a compilar isso e por isso faz rubygsub
. O pythonre
módulo parece ter uma opinião diferente embora:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
Resultado:
(x)AAAA(A)(y)BBB(B)(z)
Alguém pode fornecer uma explicação razoável para esse comportamento?
AtualizarEsse comportamento parece seruma limitação nore
módulo. A alternativaregex
módulo parece lidar com grupos em afirmações corretamente:
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)
Note que ao contráriopcre
, regex
também permite lookbehinds de largura variável:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
Eventualmente,regex
vai ser incluído na biblioteca padrão, como mencionado emPEP 411.