Direct naar de hoofdinhoud
Module 8 · Les 4 van 432/36 in de cursus~12 min
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:

Python
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

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Retourneert een object Match indien gevonden, anders None. Idiomatisch patroon:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: alleen aan het begin van de string

Python
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

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

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: vervanging

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

Het werkt ook met een vervangingsfunctie (die de Match ontvangt):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Genoemde groepen

Python
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

Python
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 too

re.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

Oefening#python.m8.l4.e1
Pogingen: 0Laden…

Gegeven `text = 'ordine #123, totaal €45,50, ricevuta #456'`, extraheer ALLE ordernummers (de cijfers na #) in `orders' als een lijst met strings. Evalueer 'bestellingen'.

Editor laden…
Toon hint

re.findall(r"#(\\d+)", tekst) — groep alleen voor cijfers vastleggen.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m8.l4.e2
Pogingen: 0Laden…

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'.

Editor laden…
Toon hint

re.sub(r"\\d+-\\d+", "XXX", s)

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m8.l4.e3
Pogingen: 0Laden…

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.

Editor laden…
Toon hint

Gebruik re.findall(r'\\d+', log_line) om alle getallen te extraheren als een lijst met tekenreeksen.

Oplossing beschikbaar na 3 pogingen