Niemożliwe patrzenie w tył z referencją wsteczną
Z mojego zrozumienia
<code>(.)(?<!\1) </code>
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ę:
<code>import re test = 'xAAAAAyBBBBz' print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test)) </code>
Wynik:
<code>(x)AAAA(A)(y)BBB(B)(z) </code>
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:
<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>
Zauważ, że w przeciwieństwie dopcre
, regex
umożliwia również śledzenie o zmiennej szerokości:
<code>print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test)) ## (x)AAAAA(y)BBBB(z) </code>
Ostatecznie,regex
zostanie uwzględniona w standardowej bibliotece, jak wspomniano wPEP 411.