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:

pythontxt = '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:

pythontxt = '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':

pythontxt = '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':

pythontxt = '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':

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # izpiše 'b!'

Praktične naloge

Задание 1

Podan je niz, ki vsebuje imena funkcij:

pythontxt = 'func1() func2() func3()'

Pridobite seznam imen funkcij iz niza.

Задание 2

Podan je niz z oznako:

pythontxt = '<a href="" class="eee" id="zzz">'

Pridobite seznam imen atributov te oznake.

Задание 3

Podan je niz s spremenljivkami:

pythontxt = '$aaa $bbb $ccc xxxx'

Pridobite podnize, pred katerimi stoji znak dolarja.