Yhdysviiva joukoissa Pythonin säännöllisissä lausekkeissa
Yhdysviiva on myös erikoismerkki [ ]-suluissa
(mutta ei sulkujen ulkopuolella). Jos tarvitset
yhdysviivaa itsessään symbolina - aseta se paikkaan,
jossa se ei tulkita ryhmän erottajaksi.
Miksi tämä on tärkeää: voit luoda merkkiryhmän
huomaamattasi. Esimerkiksi
näin - '[:-@]' - luulet valitsevasi kaksoispisteen,
yhdysviivan ja @-merkin, mutta itse asiassa saat
merkkiryhmän väliltä
: ja @. Tähän ryhmään kuuluvat
seuraavat merkit: ? < = > :
Mistä ne tulevat? ASCII-taulukosta - kaksoispisteellä on pienempi numero kuin @-merkillä - ja niin muodostuu ryhmä. Kaikki ryhmät muodostetaan ASCII-taulukon mukaan (tätä voi halutessaan hyödyntää).
Miten tämä korjataan: aseta yhdysviivamerkki
paikkaan, jossa sitä ei varmasti tulkita
ryhmäsymboliksi, esimerkiksi alkuun tai
loppuun (eli [-sulun jälkeen tai
]-sulun eteen).
Yhdysviivan voi myös escapeta - silloin
se tarkoittaa aina itseään riippumatta
asemasta. Esimerkiksi, [:-@]:n sijasta
kirjoitetaan [:\-@] - eikä ryhmää enää
muodostu, vaan on kolme merkkiä - kaksoispiste,
yhdysviiva ja @-merkki @.
Esimerkki
Seuraavassa esimerkissä hakumalli on seuraava:
numero 1, sitten kirjain väliltä 'a'
'z':een, sitten numero 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Koodin suorituksen tulos:
'! 1-2 ! !'
Esimerkki
Escapeetaan nyt yhdysviiva. Tuloksena
hakumalli on seuraava: numero
1, sitten kirjain 'a', tai
yhdysviiva, tai kirjain 'z', sitten numero
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! 1c2 !'
Esimerkki
Yhdysviivan voi myös siirtää escapettamatta sitä:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! 1c2 !'
Esimerkki
Seuraavassa esimerkissä hakumalli on seuraava:
ensimmäinen merkki on pieni kirjain tai
yhdysviiva '-', sitten kaksi kirjainta
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Koodin suorituksen tulos:
'! Axx ! @xx'
Esimerkki
Seuraavassa esimerkissä hakumalli on seuraava:
ensimmäinen merkki on pieni, iso
kirjain tai yhdysviiva '-', sitten kaksi kirjainta
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! @xx'
Esimerkki
Yhdysviivan voi sijoittaa kahden ryhmän väliin - siellä se varmasti ei luo uutta ryhmää:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! ! @xx'
Käytännön tehtävät
Annettu merkkijono:
txt = 'xaz xBz xcz x-z x@z'
Etsi kaikki merkkijonot seuraavan mallin mukaan:
kirjain 'x', iso tai pieni
kirjain tai yhdysviiva, kirjain 'z'.
Annettu merkkijono:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Etsi kaikki merkkijonot seuraavan mallin mukaan:
kirjain 'x', sitten joko dollarimerkki,
yhdysviiva tai plusmerkki, sitten kirjain 'z'.