Pozitivni in negativni pregled v regularnih izrazih Python
Včasih je treba rešiti nalogo te vrste:
poišči niz 'aaa' in ga zamenjaj
z '!', vendar le, če za
'aaa' stoji 'x', samega
'x' pa ne zamenjaj. Če poskušamo
rešiti nalogo 'na silo',
nam ne bo uspelo:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # izpiše '! baaa', želeli pa smo '!x baaa'
Pregled naprej
Za rešitev naloge potrebujemo način, da povemo,
da 'x' ne smemo zamenjati. To naredimo
s pomočjo posebnih oklepajev (?= ),
ki samo pogledajo, vendar ne zajamejo
s seboj.
Ti oklepaji se imenujejo pozitivni pregled
naprej. Pozitivni - ker mora 'x'
(v našem primeru) biti prisoten - šele takrat
se bo zamenjava zgodila.
Uporabimo te oklepaje za rešitev naše naloge:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # izpiše '!x aaab
Obstaja tudi negativni pregled naprej
- (?! ) - ta, nasprotno, pove,
da nečesa ne sme biti. V naslednjem
primeru se bo zamenjava zgodila le, če
za 'aaa' ne stoji 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # izpiše 'aaax !b'
Pregled nazaj
Podobno obstaja pozitivni
pregled nazaj - (?<= ). V
naslednjem primeru se bo zamenjava zgodila le,
če pred 'aaa' stoji 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # izpiše 'x!'
Obstaja pa tudi negativni pregled nazaj
- (?<! ). V naslednjem primeru
se bo zamenjava zgodila le, če pred
'aaa' ne stoji 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # izpiše 'b!'
Praktične naloge
Podan je niz, ki vsebuje imena funkcij:
txt = 'func1() func2() func3()'
Pridobite seznam imen funkcij iz niza.
Podan je niz z oznako:
txt = '<a href="" class="eee" id="zzz">'
Pridobite seznam imen atributov te oznake.
Podan je niz s spremenljivkami:
txt = '$aaa $bbb $ccc xxxx'
Pridobite podnize, pred katerimi stoji znak dolarja.