Merkkijoukot Pythonin säännöllisissä lausekkeissa
Merkkiryhmät \d ja \w eivät ole
kovin joustavia. Jopa niin yksinkertainen tehtävä
kuin löytää kaikki kirjaimet, mutta ei numerot -
ei voida ratkaista niillä. Tällaisia tehtäviä
varten tulisi käyttää hakasulkuja,
jotka edustavat 'tai' -operaatiota.
Hakasulkeet korvaavat yhden
merkin, minkä tahansa niistä, jotka on lueteltu sisällä. Esimerkiksi näin: x[abc]x - me
sanomme, että reunoilla täytyy olla kirjain
x, ja sisällä - yksi merkki: joko 'a',
tai 'b', tai 'c'.
Hakasulkujen jälkeen voi kirjoittaa
toistoominaisuuksia. Esimerkiksi näin:
x[abc]+x - me sanomme, että x:ien
sisällä voi olla mikä tahansa määrä merkkejä
'a', 'b' ja 'c' -
missä tahansa yhdistelmissä.
Voi paitsi luetella merkkejä, myös
luoda merkkiryhmiä kirjoittamalla kahden
merkin väliin viiva. Esimerkiksi näin:
[a-d] - saamme kaikki merkit
'a':sta 'd':hen.
Katsotaanpa esimerkein.
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'a':sta 'z':han:
Koodin suorituksen tulos:
'! ! ! x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'a':sta 'k':hon:
txt = 'xax xbx xmx x@x'
res = re.sub('x[a-k]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! xmx x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'A':sta 'Z':han:
txt = 'xax xBx xcx x@x'
res = re.sub('x[A-Z]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'xax ! xcx x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa numero 0:sta
9:ään:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[0-9]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'xax ! ! ! x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa numero 3:sta
7:ään:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[3-7]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'xax x1x ! ! x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'a':sta 'z':han tai numero
1:stä 9:ään:
txt = 'xax x1x x3x x5x x@x'
res = re.sub('x[a-z1-9]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! ! x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'a':sta 'z':han tai kirjain
'A':sta 'Z':han:
txt = 'xax xBx xcx x5x x@x'
res = re.sub('x[a-zA-Z]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! x5x x@x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä mikä tahansa kirjain
'a':sta 'z':han tai numerot 1,
2:
txt = 'xax xbx x1x x2x x3x'
res = re.sub('x[a-z12]x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! ! x3x'
Esimerkki
Tässä esimerkissä hakumalli näyttää
tältä: x:ien välissä kirjaimet 'a':sta
'z':han määrältään 1 tai
enemmän:
txt = 'xx xabesx xaadx x123x xa3x'
res = re.sub('x[a-z]+x', '!', txt)
print(res)
Koodin suorituksen tulos:
'xx ! ! ! x123x xa3x'
Esimerkki
Tehdään niin, että kirjainten määrä voi olla myös nolla:
txt = 'xx xabesx xaadx x123x xa3x'
res = re.sub('x[a-z]*x', '!', txt)
print(res)
Tuloksena saamme:
'! ! ! ! x123x xa3x'
Esimerkki
Hakasulkujen sisällä voi myös ilmoittaa erikoismerkit. Etsitään kirjainten ja numeroiden sarjaa, joka toistuu nolla tai useamman kerran:
txt = 'xx x@x xadx xas12x xa3x'
res = re.sub('x[a-z\d]*x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! x@x ! ! !'
Esimerkki
Jos meidän täytyy ilmoittaa toiset hakasulut, niin me myös pakotamme ne:
txt = 'xx xrx xas[]x x3x'
res = re.sub('x[a-z\[\]]*x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! x3x'
Käytännön tehtävät
Annettu merkkijono:
txt = 'aba aea aca aza axa'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - kirjain 'b',
'e' tai 'x'.
Annettu merkkijono:
txt = 'a1a a3a a7a a9a aba'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - numero
3:sta 6:een.
Annettu merkkijono:
txt = 'aba aea afa aha aga'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - kirjain
'a':sta 'g':aan.
Annettu merkkijono:
txt = 'aba aea afa aha aga'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - kirjain
'a':sta 'f':ään ja 'j':sta
'z':han.
Annettu merkkijono:
txt = 'aAa aea aEa aJa a3a'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - kirjain
'a':sta 'f':ään ja 'A':sta
'D':han.
Annettu merkkijono:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - pienet
latinalaiset kirjaimet, koskematta muihin.
Annettu merkkijono:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - pienet ja
suuret latinalaiset kirjaimet, koskematta
muihin.
Annettu merkkijono:
txt = 'aAXa aeffa aGha aza ax23a a3sSa'
Kirjoita säännöllinen lauseke, joka löytää
seuraavan mallin mukaan: reunoilla on kirjaimet
'a', ja niiden välissä - pienet
latinalaiset kirjaimet ja numerot, koskematta
muihin.