Lookbehind impossível com uma backreference
Do meu entendimento,
<code>(.)(?<!\1) </code>
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:
<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>
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:
<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>
Note que ao contráriopcre
, regex
também permite lookbehinds de largura variável:
<code>print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test)) ## (x)AAAAA(y)BBBB(z) </code>
Eventualmente,regex
vai ser incluído na biblioteca padrão, como mencionado emPEP 411.