Modulelessen (4/4)
re-module: regex in Python
De module re stelt reguliere expressies in Python bloot. Als je al hebt genomen
de Regex cursus op deze site vind je alle syntaxis bekend; hier
we kijken naar de API's.
Ruwe tekenreeks: r"..."
Regexes gebruiken veel backslashes (\d, \b, \s). Schrijf ze altijd als
onbewerkte strings zodat je ze niet hoeft te verdubbelen:
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"re.search: zoek het eerste exemplaar
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Retourneert een object Match indien gevonden, anders None. Idiomatisch patroon:
if m := re.search(r"\d+", testo):
print(m.group())re.match: alleen aan het begin van de string
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)Als u overal wilt zoeken, geeft u de voorkeur aan re.search.
re.findall: alle exemplaren
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']Als het patroon capture groups heeft, retourneert findall de groepen, niet de
hele wedstrijd:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: vervanging
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'Het werkt ook met een vervangingsfunctie (die de Match ontvangt):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Genoemde groepen
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno") # '2025'
m.groupdict() # {'anno': '2025', 'mese': '01', 'giorno': '15'}Handige vlaggen
re.search(r"ciao", "CIAO", re.IGNORECASE) # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE) # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL) # . matches newline toore.finditer voor geheugenveiligheid
Als u overeenkomsten in een enorm tekstblok moet verwerken, wijst re.findall een lijst in het geheugen toe die alle geëxtraheerde overeenkomstreeksen bevat. Het verdient de voorkeur om re.finditer() te gebruiken, wat een luie iterator van Match-objecten oplevert, die minimaal geheugen verbruikt.
Probeer het
Gegeven `text = 'ordine #123, totaal €45,50, ricevuta #456'`, extraheer ALLE ordernummers (de cijfers na #) in `orders' als een lijst met strings. Evalueer 'bestellingen'.
Toon hint
re.findall(r"#(\\d+)", tekst) — groep alleen voor cijfers vastleggen.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Gegeven `s = 'tel: 06-12345678 e tel: 02-9876'`, vervang alle telefoonnummers (formaat \\d+-\\d+) door de string 'XXX' en wijs deze toe aan 'masked'. Evalueer 'gemaskeerd'.
Toon hint
re.sub(r"\\d+-\\d+", "XXX", s)
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
Importeer de \`re\` module. Extraheer alle getallen die uit één of meer cijfers bestaan uit de string \`log_line = "Error 404 in 15ms"\`. Sla de lijst op in 'getallen' en evalueer deze.
Toon hint
Gebruik re.findall(r'\\d+', log_line) om alle getallen te extraheren als een lijst met tekenreeksen.
Oplossing beschikbaar na 3 pogingen