Насколько я понимаю,
(.)(?
никогда не должно совпадать. На самом деле, 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 .