Niemożliwe patrzenie w tył z referencją wsteczną
Z mojego zrozumienia
(.)(?<!\1)
nigdy nie powinien pasować. Właściwie to phppreg_replace
nawet nie chce tego skompilować, podobnie jak rubygsub
. Pythonre
moduł wydaje się mieć inną opinię:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
Wynik:
(x)AAAA(A)(y)BBB(B)(z)
Czy ktoś może przedstawić rozsądne wyjaśnienie tego zachowania?
AktualizacjaTo zachowanie wydaje się byćograniczenie wre
moduł. Alternatywaregex
moduł wydaje się poprawnie obsługiwać grupy w asercjach:
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)
Zauważ, że w przeciwieństwie dopcre
, regex
umożliwia również śledzenie o zmiennej szerokości:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
Ostatecznie,regex
zostanie uwzględniona w standardowej bibliotece, jak wspomniano wPEP 411.