Osa 12

Reguljära uttryck

Vi har redan konstaterat att Python är en utmärkt miljö för att bearbeta text. Ett ytterligare kraftfullt verktyg för textbehandling är reguljära uttryck (eng. regular expressions), ofta förkortat som regex eller regexp. De är ett sätt att välja ut och söka efter strängar som följer ett visst mönster. I det här avsnittet får du en introduktion till grunderna i reguljära uttryck, men du hittar mycket mer information på nätet, bland annat i Pythons egna handledning.

Vad är reguljära uttryck?

Reguljära uttryck är inte bara en Python-funktion. De representerar på sätt och vis ett programmeringsspråk inom ett programmeringsspråk. De är i viss utsträckning kompatibla med många olika programmeringsspråk. Reguljära uttryck har sin egen specifika syntax. Tanken är att definiera en samling strängar som följer vissa regler.

Låt oss börja med ett enkelt exempel innan vi dyker djupare in i syntaxen:

import re

orden = ["Python", "Population", "Pantomi", "Perfekt", "Prestation"]

for ord in orden:
    # Ifall strängen börjar med "P" och slutar med "on"
    if re.search("^P.*on$", ord):
        print(ord, "hittad!")
Exempelutskrift

Python hittad! Population hittad! Prestation hittad!

Vi behöver importera modulen re för att kunna använda reguljära uttryck i Python. Modulen re innehåller många funktioner för att arbeta med reguljära uttryck. I exemplet ovan tar search-funktionen två strängargument: mönstersträngen och den målsträng där mönstret ska sökas.

I det här andra exemplet letar man efter alla siffror i en sträng. Funktionen findall returnerar en lista över alla instanser som matchar mönstret:

import re

mening = "Först, 2 !#tredje 44 fem 678xyz962"

numren = re.findall("\d+", mening)

for nummer in numren:
    print(nummer)
Exempelutskrift

2 44 678 962

Syntaxen för reguljära uttryck

Låt oss bekanta oss med den grundläggande syntaxen för reguljära uttryck. De flesta av följande exempel använder sig av detta testprogram:

import re

uttryck = input("Ange uttryck: ")

while True:
    strang = input("Ange sträng: ")
    if strang == "":
        break
    if re.search(uttryck, strang):
        print("Hittad!")
    else:
        print("Hittades inte.")

Alternativa delsträngar

Lodstrecket (eng. vertical bar) |, gör att du kan matcha alternativa delsträngar. Dess betydelse är alltså eller. Uttrycket 911|112 matchar t.ex. strängar som innehåller antingen delsträngen 911 eller delsträngen 112.

Ett exempel med testprogrammet:

Exempelutskrift

Ange uttryck: aa|ee|ii Ange sträng: kassaaparat Hittad! Ange sträng: beteende Hittad! Ange sträng: friidrott Hittad! Ange sträng: kooperation Hittades inte. Ange sträng: bastuugn Hittades inte.

Grupper av tecken

Hakparenteser används för att beteckna grupper av accepterade tecken. Uttrycket [aeio] skulle t.ex. matcha alla strängar som innehåller något av tecknen a, e, i eller o.

Ett bindestreck är också tillåtet för att matcha intervall av tecken. Uttrycket [0-68a-d] skulle till exempel matcha alla strängar som innehåller en siffra mellan 0 och 6, eller en åtta, eller ett tecken mellan a och d. I den här notationen är alla intervall inkluderande.

Om du kombinerar två uppsättningar parenteser kan du matcha två tecken i följd. Till exempel skulle uttrycket [1-3][0-9] matcha alla tvåsiffriga tal mellan 10 och 39, inklusive.

Ett exempel med testprogrammet:

Exempelutskrift

Ange uttryck: [C-FRSÖ] Ange sträng: C Hittad! Ange sträng: E Hittad! Ange sträng: G Hittades inte. Ange sträng: R Hittad! Ange sträng: Ö Hittad! Ange sträng: T Hittades inte.

Upprepade matchningar

Varje del av ett uttryck kan upprepas med följande operatorer:

  • * upprepas hur många gånger som helst, inklusive noll
  • + upprepas hur många gånger som helst, men minst en gång
  • {m} upprepas exakt m gånger

Dessa operatorer fungerar på den del av uttrycket som kommer omedelbart före operatorn. Uttrycket ba+b skulle t.ex. matcha delsträngarna bab, baab och baaaaaaaaaaab, bland andra. Uttrycket A[BCDE]*Z skulle matcha delsträngarna AZ, ADZ eller ABCDEBCDEBCDEZ, bland andra.

Ett exempel med testprogrammet:

Exempelutskrift

Ange uttryck: 1[234]*5 Ange sträng: 15 Hittad! Ange sträng: 125 Hittad! Ange sträng: 145 Hittad! Ange sträng: 12342345 Hittad! Ange sträng: 126 Hittades inte. Ange sträng: 165 Hittades inte.

Andra specialtecken

En punkt är ett jokertecken som kan matcha vilket enskilt tecken som helst. Uttrycket c...o skulle till exempel matcha alla delsträngar med fem tecken som börjar med ett c och slutar med ett o, till exempel c-3po eller cello.

Tecknet ^ anger att matchningen måste ske i början av strängen och $ anger att matchningen måste ske i slutet av strängen. Dessa tecken kan också användas för att utesluta andra tecken än de angivna från matchningen:

Exempelutskrift

Ange uttryck: ^[123]*$ Ange sträng: 4 Hittades inte. Ange sträng: 1221 Hittad! Ange sträng: 333333333 Hittad!

Ibland behöver du matcha för specialtecken som är reserverade för syntaxen för reguljära uttryck. Omvänt snedstreck (eng. backslash) \ kan användas för att undkomma specialtecken. Uttrycket 1+ matchar alltså ett eller flera tal 1, men uttrycket 1\+ matchar strängen 1+.

Exempelutskrift

Ange uttryck: ^\* Ange sträng: hej* Hittades inte. Ange sträng: h*e*j Hittades inte. Ange sträng: *hej Hittad!

Runda parenteser kan användas för att gruppera ihop olika delar av uttrycket. Till exempel skulle uttrycket (ab)+c matcha delsträngarna abc, ababc och abababababababc, men inte strängarna ac eller bc, eftersom hela delsträngen ab måste förekomma minst en gång.

Exempelutskrift

Ange uttryck: ^(jabba).*(hut)$ Ange sträng: jabba the hut Hittad! Ange sträng: jabba a hut Hittad! Ange sträng: jarmo the hut Hittades inte. Ange sträng: jabba the smut Hittades inte.

Loading

Den stora finalen

Som avslutning på denna del av materialet ska vi arbeta lite mer med objekt och klasser genom att bygga ett lite mer omfattande program. Denna övning innefattar inte nödvändigtvis reguljära uttryck, men avsnitten om Funktioner som argument och list comprehension kommer sannolikt att vara användbara.

Du kan också ha nytta av de exempel som finns i modul 10.

Loading

Svara till sist på en snabb enkät:

Loading...
:
Loading...

Log in to view the quiz

Du har nått slutet av den här delen!

Se dina poäng genom att klicka på cirkeln nere till höger av sidan.