Reguljära uttryck (REGEX)


Reguljära uttryck används i många olika mjukvaror. De kan användas både för att utföra sökningar men även för att redigera text. I Python kan det exempelvis se ut på följande sätt:

import re

sträng_att_manipulera = "Vi ska byta plats på höger och vänster"
print(sträng_att_manipulera)

>>> "Vi ska byta plats på höger och vänster"

reguljärt_uttryck = r"höger och vänster"
byte = "vänster och höger"

#Koden nedan försöker matcha det reguljära uttrycket "höger och vänster" med strängen och byter ut den delen med "vänster och höger" om programmet finner den.
manipulerad_sträng = re.sub(reguljärt_uttryck, byte, sträng_att_manipulera)

print(manipulerad_sträng)
>>> "Vi ska byta plats på vänster och höger"

I exemplet ovan använde vi ett reguljärt uttryck utan några specialtecken. Det är ändå helt giltig kod eftersom reguljära uttryck är känslig för gemener och versaler. Det betyder att sträng inte skulle ha blivit manipulerad om den i stället sett ut på följande sätt:

Höger och vänster vill vi byta plats på.

I det reguljära uttrycket söker vi efter en sträng som enbart är skriven i gemener. För att även omfatta meningar där höger och vänster förekommer i början av meningar med stort H i början måste vi även anpassa vårt reguljära uttryck enligt den situationen. Men vi vill fortfarande finna förekomster där hela strängen är skriven i gemener, precis som i det första exemplet. För att åstadkomma detta kan vi föra in en teckenklass med hjälp av hakparenteser [ ].

Det reguljära uttrycket ser då ut på följande sätt: [Hh]öger och vänster och anpassat till Python-syntax samt sparad i en variabel: reguljärt_uttryck = r”[Hh]öger och vänster”

Teckenklassen markerar att vi vill ha ett av tecknen i klassen med i det reguljära uttrycket. Klarare sagt säger vi att delen vi söker efter ska inledas med stort H eller litet h följt av öger och vänster. Vi uppdaterar vårt tidigare program för att fungera i den här situationen.

import re

sträng_att_manipulera = "Höger och vänster vill vi byta plats på."
print(sträng_att_manipulera)

>>> "Höger och vänster vill vi byta plats på."

reguljärt_uttryck = r"[Hh]öger och vänster"
byte = "vänster och höger"

#Koden nedan försöker matcha det reguljära uttrycket "höger och vänster" med strängen och byter ut den delen med "vänster och höger" om den finner den.
manipulerad_sträng = re.sub(reguljärt_uttryck, byte, sträng_att_manipulera)

print(manipulerad_sträng)
>>> "vänster och höger vill vi byta plats på."

Nu blev det nästan rätt. Men bara nästan eftersom meningen nu inleds med liten bokstav och så kan vi ju inte ha det. Med like enkel kod kan vi dock samtidigt se till att även det ändras. men vi vill ju inte att det ska stå Vänster med stort V mitt inne i en mening. Därför får vi använda oss av ^ som berättar att det reguljära uttrycket ska matcha med början av strängen. (r”^vänster och höger”)

import re

sträng_att_manipulera = "Höger och vänster vill vi byta plats på."
print(sträng_att_manipulera)
>>> "Höger och vänster vill vi byta plats på."

reguljärt_uttryck = r"[Hh]öger och vänster"
byte = "vänster och höger"

#Koden nedan försöker matcha det reguljära uttrycket "höger och vänster" med strängen och byter ut den delen med "vänster och höger" om den finner den.
manipulerad_sträng = re.sub(reguljärt_uttryck, byte, sträng_att_manipulera)

#Här kontrollerar vi om "vänster och höger" förekommer i början av meningen och byter ut den med "Vänster och höger" om den finns där. Annars görs ingen ändring.
reguljärt_uttryck = r"^vänster och höger"
byte = "Vänster och höger"
manipulerad_sträng = re.sub(reguljärt_uttryck, byte, manipulerad_sträng)

print(manipulerad_sträng)
>>> "Vänster och höger vill vi byta plats på."

Sidan uppdateras kontinuerligt, men nedan finns andra funktioner i reguljära uttryck. I kolumnen ”träffar” har jag markerat de tecken respektive funktion träffar.

FörklaringSyntaxTräffar
En bokstav: a, b eller c (gemener)[abc]Baka en kaka
En bokstav: A, B eller C (versaler)[ABC]Baka en kaka
Ett tecken utom a, b, eller c (gemener)[^abc]Baka en kaka
En gemen bokstav från a till ö [a-ö] 345Eur
En versal bokstav från A till Ö[A-Ö]345Eur
En grupp i en sträng: abc(abc)abc-bok
Ett tecken från a till ö och från A till Ö[a-öA-Ö]Börjes ABCbok
Vilket enskilt tecken som helst .1 a !
Ditt eller datta|b Kebab
Blanksteg och annat ”tomt utrymme”\sKatten satt en hatt.
Alla tecken utom blanksteg eller tomt utrymme\SKatten satt en hatt.
Heltal\d5 katter
Icke-heltal\D5 katter
Matcha allt inom parentesen (inget tilldelat ID)(?…)
Fånga allt inom parentesen (tilldelat ID)(…)
Inget eller ett av akatta?Katten och katta
0 eller fler förekomster av aMa*En katt i Maastricht
1 eller fler förekomster av aa+En katt i Maastricht
Exakt x förekomster av aa{3}Han jaaamade!
X eller mer förekomster av ää{2,}Ett estniskt ord är jäääär. Det är jää + äär
X till Y förekomster av öö{2, 3}Töööö är också ett ord. Töö + öö
Strängbörjan^[Rr]ävRäven rev en annan räv
Strängslut[Rr]äv$Räven rev en annan räv
Ordgräns[Rr]äv\bVar räven en sträv räv?
Icke-ordgränssträva\BAtt sträva är att vara strävande