Pozitivni i negativni pregled u regularnim izrazima Pythona
Ponekad je potrebno rešiti problem sledećeg tipa:
pronaći string 'aaa' i zameniti ga
sa '!', ali samo ako posle
'aaa' stoji 'x', a sam
'x' pritom ne zamenjivati. Ako
pokušamo da rešimo problem 'direktno',
ništa neće uspeti:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # ispisace '! baaa', a hteli smo '!x baaa'
Pregled unapred
Za rešavanje problema potreban je način da se kaže
da 'x' ne treba zameniti. To se radi
pomoću specijalnih zagrada (?= ),
koje samo proveravaju, ali ne uzimaju
sa sobom.
Ove zagrade se zovu pozitivni pregled
unapred. Pozitivni - jer 'x'
(u našem slučaju) mora biti prisutan - tek tada
će se zamena dogoditi.
Primenimo ove zagrade da rešimo naš problem:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # ispisace '!x aaab
Postoji i negativni pregled unapred
- (?! ) - on, naprotiv, kaže
da nešto ne sme biti prisutno. U sledećem
primeru, zamena će se dogoditi samo ako
posle 'aaa' stoji NE 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # ispisace 'aaax !b'
Pregled unazad
Analogno tome, postoji pozitivni
pregled unazad - (?<= ). U
sledećem primeru zamena će se dogoditi samo
ako ispred 'aaa' stoji 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # ispisace 'x!'
Postoji i negativni pregled unazad
- (?<! ). U sledećem primeru
zamena će se dogoditi samo ako ispred
'aaa' ne stoji 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # ispisace 'b!'
Praktični zadaci
Dat je string koji sadrži imena funkcija:
txt = 'func1() func2() func3()'
Pronađite niz imena funkcija iz stringa.
Dat je string sa tagom:
txt = '<a href="" class="eee" id="zzz">'
Pronađite niz imena atributa ovog taga.
Dat je string sa promenljivim:
txt = '$aaa $bbb $ccc xxxx'
Pronađite podstringove ispred kojih stoji znak dolara.