Positiivne ja negatiivne otsing Pythoni regulaaravaldistes
Mõnikord on vaja lahendada sellist tüüpi ülesanne:
leida string 'aaa' ja asendada see
stringiga '!', kuid ainult siis, kui pärast
'aaa' on 'x', kuid 'x'
ennast ei tohi asendada. Kui me püüame
lahendada ülesannet 'täiesti otse',
siis meil ei õnnestu:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # väljund '! baaa', kuid sooviti '!x baaa'
Edasiotsing
Ülesande lahendamiseks on vaja viisi öelda,
et 'x'-d ei tohiks asendada. Seda
tehakse spetsiaalsete sulgude abil (?= ),
mis lihtsalt otsivad, kuid ei võta endaga
kaasa.
Neid sulge nimetatakse positiivseks edasiotsinguks. Positiivne - kuna 'x'
(meie puhul) peab olema - ainult siis
toimub asendus.
Rakendame neid sulge meie ülesande lahendamiseks:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # väljund '!x aaab
On olemas ka negatiivne edasiotsing
- (?! ) - see, vastupidi, ütleb,
et midagi ei tohi olla. Järgmises
näites toimub asendus ainult siis, kui
pärast 'aaa' ei ole 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # väljund 'aaax !b'
Tagasiotsing
Samamoodi on olemas positiivne
tagasiotsing - (?<= ).
Järgmises näites toimub asendus ainult
siis, kui enne 'aaa' on 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # väljund 'x!'
Ja on ka negatiivne tagasiotsing
- (?<! ). Järgmises näites
toimub asendus ainult siis, kui enne
'aaa' ei ole 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # väljund 'b!'
Praktilised ülesanded
Antud on funktsioonide nimesid sisaldav string:
txt = 'func1() func2() func3()'
Saage stringist funktsioonide nimede massiiv.
Antud on siltiga string:
txt = '<a href="" class="eee" id="zzz">'
Saage selle sildi atribuutide nimede massiiv.
Antud on muutujatega string:
txt = '$aaa $bbb $ccc xxxx'
Saage alamstringid, mille ees on dollari sümbol.