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

Насколько я понимаю,

(.)(?

никогда не должно совпадать. На самом деле, php preg_replaceдаже отказывается компилировать это, как и ruby ​​gsub. Модуль python re, похоже, придерживается другого мнения.:

import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?)', test))

Результат:

(x)AAAA(A)(y)BBB(B)(z)

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

Обновление

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

import regex

test = 'xAAAAAyBBBBz'

print (regex.sub(r'(.)(?)', test))
## xAAAAAyBBBBz

print (regex.sub(r'(.)(.)(?)', test))
## (xA)AAA(Ay)BBB(Bz)

Обратите внимание, что в отличие от pcre, regexтакже позволяет переменную -просмотр назад по ширине:

print (regex.sub(r'(.)(?)', test))
## (x)AAAAA(y)BBBB(z)

В конце концов, regexбудет включен в стандарт. библиотека, как указано в PEP 411 .

12
задан georg 24 April 2012 в 12:13
поделиться