Säännölliset lausekkeet
Python on mainio työkalu tekstin käsittelemiseen. Yksi työkalu tekstin käsittelemisessä ovat säännölliset lausekkeet (regular expressions), joiden avulla voi esimerkiksi poimia ja etsiä merkkijonoja, jotka ovat tietyn muotoisia. Tässä osiossa käydään läpi säännöllisten lausekkeiden perusteita, ja löydät lisää tietoa Pythonin omasta tutoriaalista.
Mitä ovat säännölliset lausekkeet?
Säännölliset lausekkeet ovat tavallaan ohjelmointikieli ohjelmointikielen sisällä. Lausekkeilla on oma syntaksinsa, jonka mukaan ne määritellään. Ideana on, että säännöllisellä lausekkeella määritellään sellaisten merkkijonojen joukko, jotka ovat tiettyjen sääntöjen mukaisia.
Tarkistellaan yksinkertaista esimerkkiä lausekkeiden käytöstä ennen tarkempaa perehtymistä sääntöihin:
import re
sanat = ["Python", "Ponneton", "Ponttooni", "Pullero", "Pallon"]
for sana in sanat:
# merkkijonon tulee alkaa "P" ja päättyä "on"
if re.search("^P.*on$", sana):
print(sana, "löytyy!")
Python löytyy! Ponneton löytyy! Pallon löytyy!
Pythonissa säännöllisiä lausekkeita voi käsitellä moduulin re
avulla. Esimerkiksi yllä olevassa koodissa oleva metodi search
etsii merkkijonosta osaa, joka täsmää annettuun säännölliseen lausekkeeseen.
Huomaa, että säännöllinen lauseke annetaan merkkijonona funktion search
parametriksi.
Toinen esimerkki etsii merkkijonosta luvut. Metodi findall
palauttaa kaikki säännölliseen lausekkeeseen täsmäävät osajonot listana:
import re
lause = "Eka, 2 !#kolmas 44 viisi 678xyz962"
luvut = re.findall("\d+", lause)
for luku in luvut:
print(luku)
2 44 678 962
Säännöllisten lausekkeiden syntaksi
Tarkastellaan seuraavaksi syntaksia, jota säännöllisissä lausekkeissa käytetään. Useimmissa esimerkeissä käytetään samaa testiohjelmaa eri syötteillä.
import re
lauseke = input("Anna lauseke: ")
while True:
mjono = input("Anna merkkijono: ")
if mjono == "":
break
if re.search(lauseke, mjono):
print("Osuma!")
else:
print("Ei osumaa.")
Vaihtoehtoiset alijonot
Pystyviivalla voidaan erottaa vaihtoehtoisia osajonoja. Esimerkiksi lauseke 911|112
täsmää merkkijonoihin, joista löytyy joko osajono 911
tai osajono 112
.
Esimerkiksi
Anna lauseke: aa|ee|ii Anna testijono: saapas Osuma! Anna testijono: teema Osuma! Anna testijono: iilimato Osuma! Anna testijono: ooppera Ei osumaa. Anna testijono: uuttera Ei osumaa.
Merkkijoukot
Hakasulkeiden väliin voidaan merkitä joukko hyväksyttyjä merkkejä. Esimerkiksi merkintä [aeio]
täsmää jonoihin, joista löytyy jokin merkeistä a, e, i, tai o. Merkintätapa sallii myös väliviivan käytön. Merkintä [0-68a-d]
hyväksyy jonot, joista löytyy numero nollasta kuuteen, kahdeksikko tai merkki väliltä a...d. Merkintä [1-3][0-9]
hyväksyy kaksinumeroiset luvut väliltä 10...39.
Esimerkiksi:
Anna lauseke: [C-FRSÖ] Anna testijono: C Osuma! Anna testijono: E Osuma! Anna testijono: G Ei osumaa. Anna testijono: R Osuma! Anna testijono: Ö Osuma! Anna testijono: T Ei osumaa.
Toistaminen
Lausekkeen osaa voidaan toistaa esimerkiksi seuraavien operaattorien avulla:
*
toistaa osaa minkä tahansa määrän kertoja (myös nolla)+
toistaa osaa minkä tahansa määrän kertoja (ainakin yhden){m}
toistaa osaa täsmälleenm
kertaa
Operaattorit viittaavat niitä edeltävään lausekkeen osaan. Esimerkiksi lauseke ba+b
hyväksyy esimerkiksi osajonot bab
, baab
ja baaaaaaaaaaab
. Lauseke A[BCDE]*Z
puolestaan hyväksyy esimerkiksi osajonot AZ
, ADZ
tai ABCDEBCDEBCDEZ
.
Esimerkiksi:
Anna lauseke: 1[234]*5 Anna testijono: 15 Osuma! Anna testijono: 125 Osuma! Anna testijono: 145 Osuma! Anna testijono: 12342345 Osuma! Anna testijono: 126 Ei osumaa. Anna testijono: 165 Ei osumaa.
Muita erikoismerkkejä
Pisteellä merkitään mitä tahansa yksittäistä merkkiä. Niinpä merkintä c...o
vastaa esimerkiksi merkkijonoja c-3po
tai combo
. Merkillä ^
voidaan määritellä, että osuman pitää löytyä merkkijonon alusta, ja vastaavasti merkillä $
, että sen on oltava lopussa. Näillä voidaan näppärästi myös rajata sääntö koskemaan vain annettuja merkkejä:
Anna lauseke: ^[123]*$ Anna testijono: 4 Ei osumaa. Anna testijono: 1221 Osuma! Anna testijono: 333333333 Osuma!
Kenoviivaa voidaan käyttää etsimään erikoismerkkejä. Merkintä 1+
tarkoittaa yhtä tai useampaa ykköstä, mutta merkintä 1\+
merkkijonoa 1+
.
Esimerkiksi
Anna lauseke: ^\* Anna testijono: moi* Ei osumaa. Anna testijono: m*o*i Ei osumaa. Anna testijono: *moi Osuma!
Kaarisulkeilla voidaan ryhmitellä lausekkeen osia. Esimerkiksi lauseke (ab)+c
hyväksyy jonot abc
, ababc
ja ababababababc
, mutta ei esimerkiksi jonoja ac
tai bc
.
Esimerkiksi
Anna lauseke: ^(jabba).*(hut)$ Anna testijono: jabba the hut Osuma! Anna testijono: jabba a hut Osuma! Anna testijono: jarmo the hut Ei osumaa. Anna testijono: jabba the smut Ei osumaa.
Loppuhuipennus
Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun Funktio parametrina asia tulee olemaan tarpeen ja myös listakoosteet voivat olla käyttökelpoisia.
Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 viimeisestä luvusta.
Vastaa lopuksi osion loppukyselyyn:
Log in to view the quiz