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?

Atualizar

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

questionAnswers(1)

yourAnswerToTheQuestion