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:

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

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

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

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

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

print(res) # ispisace 'b!'

Praktični zadaci

Задание 1

Dat je string koji sadrži imena funkcija:

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

Pronađite niz imena funkcija iz stringa.

Задание 2

Dat je string sa tagom:

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

Pronađite niz imena atributa ovog taga.

Задание 3

Dat je string sa promenljivim:

pythontxt = '$aaa $bbb $ccc xxxx'

Pronađite podstringove ispred kojih stoji znak dolara.