Reguliere expressies in Python
Dit artikel legt reguliere expressies in Python uit.
We behandelen een breed scala aan onderwerpen, van het basisgebruik van de re-module tot complexe patroonherkenning met reguliere expressies.
YouTube Video
Reguliere expressies in Python
De re-module wordt gebruikt voor het zoeken en manipuleren van strings met behulp van reguliere expressies.
Wat is de re-module?
De re-module is onderdeel van de standaardbibliotheek van Python en biedt functionaliteit voor het manipuleren van strings met behulp van reguliere expressies. Reguliere expressies worden gebruikt om efficiënt specifieke stringpatronen te vinden, te extraheren of te vervangen.
Basispatronen van reguliere expressies
Reguliere expressies definiëren patronen met behulp van speciale symbolen. Hieronder staan enkele basispatronen.
.: Elk enkel teken^: Begin van een string$: Einde van een string\d: Elk cijfer (0-9)\w: Elk woordteken (a-z, A-Z, 0-9, _)\s: Elk witruimte-karakter*: Nul of meer herhalingen+: Eén of meer herhalingen[]: Tekenklasse (bijv.[a-z]komt overeen met kleine letters)
1import re
2
3pattern = r"\d{3}-\d{4}"
4text = "My postal code is 123-4567."
5result = re.search(pattern, text)
6if result:
7 print(result.group()) # Output: 123-4567
8
9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18 print("Matched:", result.group())
19else:
20 print("No match")- Deze code controleert eerst of de string overeenkomt met een postcodepatroon. Vervolgens controleert het of de volledige string (van begin tot eind) overeenkomt met een patroon dat bestaat uit een woord, witruimte, cijfers, witruimte en een Engels woord. Dit helpt je te begrijpen hoe de basiselementen van reguliere expressies kunnen worden gecombineerd.
Hoe matchingfuncties te gebruiken
re.match()
re.match() controleert of het begin van de string overeenkomt met het opgegeven patroon.
1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7 print(match.group()) # Output: Python- Deze code controleert of de string begint met een woordteken (alfanumeriek of underscore). Het eerste woord 'Python' komt overeen met het patroon en wordt teruggegeven.
re.search()
re.search() scant de hele string en retourneert de eerste overeenkomst.
1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7 print(search.group()) # Output: powerful- Deze code doorzoekt de gehele string naar het woord 'powerful' en retourneert de eerste overeenkomst. Als resultaat geeft
re.search()de overeenkomende string 'powerful' terug.
re.findall()
re.findall() retourneert alle overeenkomsten van het patroon als een lijst.
1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches) # Output: ['Python', 'strong']- Deze code vindt alle woorden die precies zes tekens lang zijn en geeft ze terug als een lijst. 'Python' in de string voldoet aan de voorwaarde, en de lijst
['Python']wordt teruggegeven.
re.finditer()
re.finditer() retourneert alle overeenkomsten als een iterator, waarmee u gedetailleerde informatie voor elke overeenkomst kunt ophalen.
1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7 print(match.group()) # Output: Python- Deze code zoekt achtereenvolgens naar alle woorden van zes letters en verwerkt elke overeenkomst via een iterator. 'Python' komt hier overeen met het patroon en wordt teruggegeven.
Vervangen en Splitsen
re.sub()
re.sub() vervangt delen van de string die overeenkomen met de reguliere expressie door een andere string.
1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text) # Output: There are many apples- Deze code vervangt alle cijfers in de string door 'many'.
re.split()
re.split() splitst de string op delen die overeenkomen met de reguliere expressie.
1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts) # Output: ['Python', 'is', 'powerful']- Deze code splitst de string op één of meer witruimtetekens. Hierdoor wordt de string in woorden gesplitst, wat
['Python', 'is', 'powerful']oplevert.
Groepen en Vangsten
Door groepen in reguliere expressies te gebruiken, wordt het eenvoudig om overeenkomende subreeksen te extraheren. Door tekst tussen haakjes () te plaatsen, wordt deze vastgelegd als een groep.
1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7 print(match.group(1)) # Output: 123
8 print(match.group(2)) # Output: 4567- Deze code extraheert de 3-cijferige en 4-cijferige getallen als aparte groepen uit een postcode in de vorm '123-4567'.
group(1)geeft de eerste drie cijfers '123' terug, engroup(2)geeft de laatste vier cijfers '4567' terug.
Benoemde groepen
Met benoemde groepen kun je waarden opvragen aan de hand van betekenisvolle namen in plaats van op indexen te vertrouwen. Hieronder staat een concreet voorbeeld dat de datum en het niveau uit een log haalt.
1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8 print(m.group("date"), m.group("time"), m.group("level"))
9 print("message:", m.group("msg"))- Deze code gebruikt benoemde groepen om de datum, tijd, het niveau en het bericht uit een logstring te halen. Hij haalt de waarden op met betekenisvolle namen in plaats van indexen.
Vlagopties Gebruiken
De re-module heeft verschillende vlagopties om zoekgedrag te regelen.
re.IGNORECASE(re.I): Een vlagoptie die ervoor zorgt dat overeenkomsten niet hoofdlettergevoelig zijn.re.MULTILINE(re.M): Een vlagoptie die overeenkomsten over meerdere regels mogelijk maakt.re.DOTALL(re.S): Een vlagoptie waarbij een punt.ook overeenkomt met nieuwe regeltekens.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7 print(match.group()) # Output: Python- Deze code zoekt hoofdletterongevoelig naar het woord 'python'. Door de vlag
re.IGNORECASEte gebruiken, komt ook 'Python' overeen.
Voordelen van reguliere-expressieobjecten (re.compile)
Een patroon compileren met re.compile maakt hergebruik efficiënter en verbetert de leesbaarheid. Je kunt hier ook vlaggen instellen.
Het volgende voorbeeld zoekt herhaaldelijk naar overeenkomsten over meerdere regels met een gecompileerd patroon. Als je hetzelfde patroon vaak gebruikt, verbetert het compileren met re.compile de prestaties.
1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7 print(m.groups())- Deze code gebruikt een gecompileerde reguliere expressie om gebruikersnamen en ID's uit meerdere regels te halen.
re.compileverbetert de efficiëntie bij hergebruik van hetzelfde patroon en maakt de code ook leesbaarder.
Toepassingen
Beschouw bijvoorbeeld een script dat alle e-mailadressen uit een tekstbestand haalt.
1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails) # Output: ['info@example.com', 'support@service.com']- Deze code vindt alle e-mailadressen in de string en haalt ze op als een lijst.
Conclusie
De re-module is een krachtig hulpmiddel voor het manipuleren van strings in Python. Hier hebben we een breed scala behandeld, van basisgebruik tot geavanceerde reguliere expressies met groepen en vlagopties. De reguliere expressies van Python zijn zeer krachtig en een onmisbare tool voor tekstverwerking.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.