Python Regular Expressions (re-module) – een praktische gids
Python Regular Expressions (re-module) – een praktische gids
Ontdek hoe je de kracht van regular expressions in Python kunt benutten met de re-module. Stap-voor-stap voorbeelden illustreren veelvoorkomende patronen, matching-technieken en geavanceerde functies.
Wat is een Regular Expression?
Een regular expression (RegEx) is een reeks karakters die een zoekpatroon definieert. Bijvoorbeeld, het patroon ^a...s$ matched elke vijf-letter string die begint met a en eindigt met s.
^a...s$
Patronen kunnen gebruikt worden om te matchen tegen strings. De volgende tabel demonstreert hoe het patroon zich gedraagt met verschillende inputs:
| Expressie | String | Gematched? |
|---|---|---|
^a...s$ | abs | Geen match |
alias | Match | |
abyss | Match | |
Alias | Geen match | |
Een abacus | Geen match |
Python's re-module biedt de tools die je nodig hebt om met RegEx te werken. Hier is een snel voorbeeld dat re.match() gebruikt om een patroon te checken tegen een string:
import re
patroon = '^a...s$'
test_string = 'abyss'
resultaat = re.match(patroon, test_string)
if resultaat:
print("Zoeken succesvol.")
else:
print("Zoeken onsuccesvol.")
Wanneer het patroon gevonden wordt, retourneert re.match() een match-object; anders None.
Patronen specificeren met metakarakters
Metakarakters zijn speciale symbolen die de regex-engine op een unieke manier interpreteert. Hieronder een snel overzicht van de meest voorkomende metakarakters:
[] . ^ $ * + ? {} () \ |
Vierkante haken: []
Vierkante haken definiëren een set karakters om te matchen. Bijvoorbeeld, [abc] matched elke enkele voorkomens van a, b of c.
| Expressie | String | Gematched? |
|---|---|---|
[abc] | a | 1 match |
ac | 2 matches | |
Hey Jude | Geen match | |
abc de ca | 5 matches |
Ranges kunnen uitgedrukt worden met een bindstreep, bijv. [a-e] gelijk aan [abcde]. Om een set te inverteren, plaats een caret ^ na de openende haak, bijv. [^abc] matched elk karakter behalve a, b of c.
Punt: .
De punt matched elk enkel karakter behalve een newline.
| Expressie | String | Gematched? |
|---|---|---|
.. | a | Geen match |
ac | 1 match | |
acd | 1 match | |
acde | 2 matches (bevat 4 karakters) |
Caret: ^ en Dollar: $
De caret bewerkt het begin van een string; het dollarteken bewerkt het einde. Bijvoorbeeld, ^a matched elke string beginnend met a, terwijl a$ elke string matched die eindigt met a.
| Expressie | String | Gematched? |
|---|---|---|
^a | a | 1 match |
abc | 1 match | |
bac | Geen match | |
^ab | abc | 1 match |
acb | Geen match (start met a maar niet gevolgd door b) |
| Expressie | String | Gematched? |
|---|---|---|
a$ | a | 1 match |
formule | 1 match | |
cab | Geen match |
Quantifiers: *, +, ?, {n,m}
Deze symbolen controleren hoe vaak het voorgaande element moet voorkomen.
*– nul of meer keer.+– één of meer keer.?– nul of één keer.{n,m}– minstens n en maximaal m keer.
Voorbeelden:
| Expressie | String | Gematched? |
|---|---|---|
ma*n | mn | 1 match |
man | 1 match | |
maaan | 1 match | |
main | Geen match (a niet gevolgd door n) | |
vrouw | 1 match |
| Expressie | String | Gematched? |
|---|---|---|
ma+n | mn | Geen match (geen a) |
man | 1 match | |
maaan | 1 match | |
main | Geen match (a niet gevolgd door n) | |
vrouw | 1 match |
| Expressie | String | Gematched? |
|---|---|---|
ma?n | mn | 1 match |
man | 1 match | |
maaan | Geen match (meer dan één a) | |
main | Geen match (a niet gevolgd door n) | |
vrouw | 1 match |
| Expressie | String | Gematched? |
|---|---|---|
a{2,3} | abc dat | Geen match |
abc daat | 1 match (bij daat) | |
aabc daaat | 2 matches (bij aabc en daaat) | |
aabc daaaat | 2 matches (bij aabc en daaaat) |
Algemeen gebruikt patroon: [0-9]{2,4} matched twee tot vier opeenvolgende cijfers.
| Expressie | String | Gematched? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1 match (bij ab123csde) |
12 en 345673 | 3 matches (12, 3456, 73) | |
1 en 2 | Geen match |
Alternatie: |
De verticale balk implementeert logische OR. Bijvoorbeeld, a|b matched elke string die a of b bevat.
| Expressie | String | Gematched? |
|---|---|---|
a|b | cde | Geen match |
ade | 1 match (bij ade) | |
acdbea | 3 matches (bij acdbea) |
Groeperen: ()
Haakjes groeperen sub-patronen en vangen gematchte substrings. Voorbeeld: (a|b|c)xz matched elke string die a, b of c bevat gevolgd door xz.
| Expressie | String | Gematched? |
|---|---|---|
(a|b|c)xz | ab xz | Geen match |
abxz | 1 match (bij abxz) | |
axz cabxz | 2 matches (bij axzbc cabxz) |
Escapen: \
Gebruik een backslash om een metakarakter als literaal te behandelen. Bijvoorbeeld, \$a matched de letterlijke reeks $a in plaats van $ te interpreteren als end-of-string anker.
Speciale Sequences
Speciale sequences vereenvoudigen veelvoorkomende patronen. Hieronder een referentielijst met illustrerende voorbeelden.
Begin van string: \A
| Expressie | String | Gematched? |
|---|---|---|
\Athe | de zon | Match |
In de zon | Geen match |
Woordgrens: \b
| Expressie | String | Gematched? |
|---|---|---|
\bfoo | voetbal | Match |
een voetbal | Match | |
avoetbal | Geen match | |
foo\b | de foo | Match |
de afoo test | Match | |
de avoetest | Geen match |
Niet-woordgrens: \B
| Expressie | String | Gematched? |
|---|---|---|
\Bfoo | voetbal | Geen match |
een voetbal | Geen match | |
avoetbal | Match | |
foo\B | de foo | Geen match |
de afoo test | Geen match | |
de avoetest | Match |
Cijfer: \d / Niet-cijfer: \D
| Expressie | String | Gematched? |
|---|---|---|
\d | 12abc3 | 3 matches (bij 12abc3) |
Python | Geen match | |
\D | 1ab34"50 | 3 matches (bij 1ab34"50) |
1345 | Geen match |
Whitespace: \s / Niet-whitespace: \S
| Expressie | String | Gematched? |
|---|---|---|
\s | Python RegEx | 1 match |
PythonRegEx | Geen match | |
\S | a b | 2 matches (bij a b) |
| Geen match |
Woordkarakter: \w / Niet-woord: \W
| Expressie | String | Gematched? |
|---|---|---|
\w | 12&": ;c | 3 matches (bij 12": ;c) |
"%> ! | Geen match | |
\W | 1a2%c | 1 match (bij 1a2%c) |
Python | Geen match |
Einde van string: \Z
| Expressie | String | Gematched? |
|---|---|---|
Python\Z | Ik hou van Python | 1 match |
Ik hou van Python Programmeren | Geen match | |
Python is leuk. | Geen match |
Tip: Gebruik een online regex-tester zoals regex101 om patronen snel te maken en debuggen.
RegEx in Python gebruiken
Python's re-module biedt een rijke set functies en constanten voor regex-operaties. Importeer het met:
import re
Hieronder de meest voorkomende utilities en hoe je ze gebruikt.
re.findall()
Retourneert een lijst van alle non-overlapping matches in een string.
# Alle getallen uit een string halen
import re
string = 'hallo 12 hi 89. Hoe gaat het 34'
patroon = '\d+'
resultaat = re.findall(patroon, string)
print(resultaat) # Uitvoer: ['12', '89', '34']
Bij geen match wordt een lege lijst geretourneerd.
re.split()
Splitst een string op elk punt waar het patroon matched, retourneert een lijst van substrings.
import re
string = 'Twaalf:12 Negenentachtig:89.'
patroon = '\d+'
resultaat = re.split(patroon, string)
print(resultaat) # Uitvoer: ['Twaalf:', ' Negenentachtig:', '.']
Gebruik de optionele maxsplit-argument om het aantal splitsingen te beperken. Waarde 0 (standaard) splitst bij elke match.
import re
string = 'Twaalf:12 Negenentachtig:89 Negen:9.'
patroon = '\d+'
# Split alleen bij eerste voorkomen
resultaat = re.split(patroon, string, 1)
print(resultaat) # Uitvoer: ['Twaalf:', ' Negenentachtig:89 Negen:9.']
re.sub()
Vervangt alle voorkomens van een patroon met een vervangingsstring.
# Alle whitespace-karakters verwijderen
import re
string = 'abc 12\nde 23 \n f45 6'
patroon = '\s+'
vervang = ''
nieuwe_string = re.sub(patroon, vervang, string)
print(nieuwe_string) # Uitvoer: abc12de23f456
Om vervangingen te beperken, geef een count-argument. Waarde 0 vervangt elke match.
nieuwe_string = re.sub(r'\s+', vervang, string, 1)
print(nieuwe_string) # Uitvoer: abc12de 23 f45 6
re.subn()
Als re.sub(), maar retourneert een tuple met de nieuwe string en het aantal vervangingen.
nieuwe_string = re.subn(patroon, vervang, string)
print(nieuwe_string) # Uitvoer: ('abc12de23f456', 4)
re.search()
Vindt de eerste locatie waar het patroon matched.
string = "Python is leuk"
match = re.search('\\APython', string)
if match:
print("patroon gevonden in de string")
else:
print("patroon niet gevonden")
# Uitvoer: patroon gevonden in de string
Match-object
Wanneer een match gevonden wordt, retourneert re.search() een Match-object. Veelvoorkomende methoden en attributen:
group()– de gematchte substring.start()/end()– indices van de match.span()– een tuple van (start, end).groups()– alle gevangen groepen.
string = '39801 356, 2102 1111'
patroon = '(\\d{3}) (\\d{2})'
match = re.search(patroon, string)
if match:
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())
print(match.start(), match.end(), match.span())
else:
print("patroon niet gevonden")
# Uitvoer:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Raw strings gebruiken (prefix r)
Een string-literal prefixen met r behandelt backslashes als letterlijke karakters, wat per-ongeval escapesequenties voorkomt. Dit is vooral nuttig in regex-patronen.
string = '\n en \r zijn escapesequenties.'
resultaat = re.findall(r'[\n\r]', string)
print(resultaat) # Uitvoer: ['\n', '\r']
Voor diepere verkenning van de re-module, raadpleeg de officiële Python-documentatie.
Python
- Python Keywords en Identifiers: Gereserveerde woorden en naamconventies onder de knie krijgen
- Python Datatypes onder de knie krijgen: Een praktische gids
- Python Operators onder de knie krijgen: Een uitgebreide gids
- Python Pass Statement onder de knie krijgen: Een praktische gids
- Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
- Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
- Python-iterators: hoe ze werken en hoe je je eigen maakt
- Python-closures uitgelegd: hoe geneste functies variabelen vangen
- Python datetime beheersen: praktische gids voor datums, tijden en tijdzones
- Python's time-module beheersen: functies, structs en praktische voorbeelden
- Python's time.sleep() onder de knie krijgen: best practices, multithreading en real-world voorbeelden