Dalla mia comprensione,lookbehind impossibile con un backreference
(.)(?<!\1)
non deve mai corrispondere. In realtà, php's preg_replace
si rifiuta anche di compilare questo e così fa rubino gsub
. Il modulo python re
sembra avere un parere diverso però:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
Risultato:
(x)AAAA(A)(y)BBB(B)(z)
Qualcuno può fornire una spiegazione ragionevole per questo comportamento?
Aggiornamento
Questo comportamento sembra essere a limitation nel modulo re
. Il modulo alternativa regex
sembra per gestire gruppi di affermazioni correttamente:
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)
Si noti che diversamente pcre
, regex
permette anche lookbehinds larghezza variabile:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
Alla fine, regex
sta per essere inclusi nello standard libreria, come indicato in PEP 411.
E 'corrispondenti come se hai usato '(.) (?! \ 1)'. – FakeRainBrigand