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!")
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)
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:
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:
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 exaktm
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:
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:
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+
.
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.
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.
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.
Svara till sist på en snabb enkät:
Log in to view the quiz
Se dina poäng genom att klicka på cirkeln nere till höger av sidan.