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:

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

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

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

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

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

print(res) # tulostaa 'b!'

Käytännön tehtäviä

Задание 1

Annettu merkkijono, joka sisältää funktion nimiä:

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

Hanki funktioiden nimet taulukkona merkkijonosta.

Задание 2

Annettu merkkijono tagilla:

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

Hanki tämän tagin attribuuttien nimet taulukkona.

Задание 3

Annettu merkkijono muuttujilla:

pythontxt = '$aaa $bbb $ccc xxxx'

Hanki merkkijonot, joiden edessä on dollarimerkki.