Невозможный взгляд назад с обратной ссылкой

Из моего понимания,

<code>(.)(?<!\1)
</code>

никогда не должно совпадать. На самом деле, phppreg_replace даже отказывается компилировать это, как и ruby 'sgsub, Питонre Модуль, похоже, имеет другое мнение:

<code>import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
</code>

Результат:

<code>(x)AAAA(A)(y)BBB(B)(z)
</code>

Кто-нибудь может дать разумное объяснение этому поведению?

Update

Такое поведение представляетсяограничение вre модуль. Альтернативаregex Кажется, модуль правильно обрабатывает группы в утверждениях:

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

Обратите внимание, что в отличие отpcre, regex также позволяет смотреть за переменной ширины:

<code>print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
</code>

В конце концов,regex будет включен в стандартную библиотеку, как указано вОПТОСОЗ 411.

Ответы на вопрос(1)

Ваш ответ на вопрос