Osa 12

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!")
Esimerkkitulostus

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)
Esimerkkitulostus

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

Esimerkkitulostus

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:

Esimerkkitulostus

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älleen m 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:

Esimerkkitulostus

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ä:

Esimerkkitulostus

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+ tarkoitaa yhtä tai useampaa ykköstä, mutta merkintä 1\+ merkkijonoa 1+.

Esimerkiksi

Esimerkkitulostus

Anna lauseke: ^* Anna testijono: moi* Ei osumaa. Anna testijono: moi 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

Esimerkkitulostus

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.

Loading

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.

Loading

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz