Positiivinen ja negatiivinen eteen- ja taaksepäin katselu Pythonin säännöllisissä lausekkeissa
Joskus on ratkaistava seuraavanlainen tehtävä:
etsi merkkijono 'aaa' ja korvaa se
merkkijonolla '!', mutta vain jos
'aaa'n jälkeen on 'x', mutta
'x'ä ei itsessään korvata. Jos yritämme
ratkaista tehtävän 'suoraan',
emme onnistu:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # tulostaa '! baaa', halusimme '!x baaa'
Eteenpäin katselu
Tehtävän ratkaisemiseksi tarvitaan tapa sanoa,
että 'x'ä ei tulisi korvata. Tämä tehdään
erikoisilla sulkeilla (?= ),
jotka vain katsovat, mutta eivät ota
mukaansa.
Näitä sulkeita kutsutaan positiiviseksi eteenpäin
katseluksi. Positiivinen - koska 'x'n
(meidän tapauksessamme) on oltava - vain silloin
korvaus tapahtuu.
Sovelletaan näitä sulkeita tehtävämme ratkaisemiseen:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # tulostaa '!x aaab
On olemassa myös negatiivinen eteenpäin katselu
- (?! ) - se puolestaan sanoo,
että jotain ei saa olla. Seuraavassa
esimerkissä korvaus tapahtuu vain, jos
'aaa'n jälkeen EI ole 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # tulostaa 'aaax !b'
Taaksepäin katselu
Vastaavasti on olemassa positiivinen
taaksepäin katselu - (?<= ).
Seuraavassa esimerkissä korvaus tapahtuu vain,
jos 'aaa'n edessä on 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # tulostaa 'x!'
Ja on myös olemassa negatiivinen taaksepäin katselu
- (?<! ). Seuraavassa esimerkissä
korvaus tapahtuu vain, jos 'aaa'n
edessä EI ole 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # tulostaa 'b!'
Käytännön tehtäviä
Annettu merkkijono, joka sisältää funktion nimiä:
txt = 'func1() func2() func3()'
Hanki funktioiden nimet taulukkona merkkijonosta.
Annettu merkkijono tagilla:
txt = '<a href="" class="eee" id="zzz">'
Hanki tämän tagin attribuuttien nimet taulukkona.
Annettu merkkijono muuttujilla:
txt = '$aaa $bbb $ccc xxxx'
Hanki merkkijonot, joiden edessä on dollarimerkki.