Невозможный взгляд назад с обратной ссылкой
Из моего понимания,
<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.