Python Reguliere Expressies onder de knie: een praktische gids
Een reguliere expressie is een speciale tekensequentie die helpt om andere tekenreeksen of sets van tekenreeksen te matchen of te vinden, met behulp van een gespecialiseerde syntax die in een patroon wordt vastgelegd. Reguliere expressies worden veel gebruikt in de UNIX-wereld.
De Python-module re biedt volledige ondersteuning voor Perl-achtige reguliere expressies in Python. De re-module genereert de uitzondering re.error als er een fout optreedt tijdens het compileren of gebruiken van een reguliere expressie.
We bespreken twee belangrijke functies die gebruikt worden om reguliere expressies te hanteren. Maar eerst een klein detail: er zijn verschillende tekens die een speciale betekenis hebben wanneer ze in een reguliere expressie worden gebruikt. Om verwarring te vermijden bij het werken met reguliere expressies, gebruiken we Raw Strings als r'expressie'.
De match-functie
Deze functie probeert het RE-patroon te matchen met de string met optionele flags.
Hier is de syntaxis voor deze functie:
re.match(patroon, string, flags=0)
Beschrijving van de parameters:
| Nr. | Parameter & Beschrijving |
|---|---|
| 1 | patroon Dit is de reguliere expressie die gematcht moet worden. |
| 2 | string Dit is de string die doorzocht wordt om het patroon aan het begin van de string te matchen. |
| 3 | flags U kunt verschillende vlaggen specificeren met bitwise OR (|). Dit zijn modifiers, die in de onderstaande tabel worden weergegeven. |
De re.match-functie retourneert een match-object bij succes, None bij mislukking. We gebruiken group(num) of groups() functie van het match-object om de gematchte expressie op te halen.
| Nr. | Match Object Methode & Beschrijving |
|---|---|
| 1 | group(num=0) Deze methode retourneert de volledige match (of specifieke subgroep num) |
| 2 | groups() Deze methode retourneert alle matchende subgroepen in een tuple (lege tuple als er geen waren) |
Voorbeeld
Live Demo#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
Wanneer de bovenstaande code wordt uitgevoerd, produceert het het volgende resultaat:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
De search-functie
Deze functie zoekt naar de eerste voorkomen van het RE-patroon binnen de string met optionele flags.
Syntaxis:
re.search(patroon, string, flags=0)
Beschrijving van de parameters:
| Nr. | Parameter & Beschrijving |
|---|---|
| 1 | patroon Dit is de reguliere expressie die gematcht moet worden. |
| 2 | string Dit is de string die doorzocht wordt om het patroon ergens in de string te matchen. |
| 3 | flags U kunt verschillende vlaggen specificeren met bitwise OR (|). Dit zijn modifiers, die in de onderstaande tabel worden weergegeven. |
De re.search-functie retourneert een match-object bij succes, none bij mislukking. We gebruiken group(num) of groups() functie van het match-object om de gematchte expressie op te halen.
| Nr. | Match Object Methodes & Beschrijving |
|---|---|
| 1 | group(num=0) Deze methode retourneert de volledige match (of specifieke subgroep num) |
| 2 | groups() Deze methode retourneert alle matchende subgroepen in een tuple (lege tuple als er geen waren) |
Voorbeeld
Live Demo#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"
Wanneer de bovenstaande code wordt uitgevoerd, produceert het het volgende resultaat:
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
Matchen versus Zoeken
Python biedt twee verschillende primitieve operaties gebaseerd op reguliere expressies: match controleert op een match alleen aan het begin van de string, terwijl search controleert op een match ergens in de string (dit is wat Perl standaard doet).
Voorbeeld
Live Demo#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match(r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
searchObj = re.search(r'dogs', line, re.M|re.I)
if searchObj:
print "search --> searchObj.group() : ", searchObj.group()
else:
print "Nothing found!!"
Wanneer de bovenstaande code wordt uitgevoerd, produceert het het volgende resultaat:
No match!! search --> searchObj.group() : dogs
Zoeken en Vervangen
Een van de belangrijkste re-methoden die reguliere expressies gebruikt, is sub.
Syntaxis
re.sub(patroon, vervanging, string, max=0)
Deze methode vervangt alle voorkomens van het RE-patroon in string met vervanging, waarbij alle voorkomens worden vervangen tenzij max is opgegeven. Deze methode retourneert de gewijzigde string.
Voorbeeld
Live Demo#!/usr/bin/python import re phone = "2004-959-559 # Dit is een telefoonnummer" # Python-stijl commentaar verwijderen num = re.sub(r'#.*$', "", phone) print "Phone Num : ", num # Alles behalve cijfers verwijderen num = re.sub(r'\D', "", phone) print "Phone Num : ", num
Wanneer de bovenstaande code wordt uitgevoerd, produceert het het volgende resultaat:
Phone Num : 2004-959-559 Phone Num : 2004959559
Reguliere Expressie Modifiers: Optie Vlaggen
Reguliere expressie literalen mogen een optionele modifier bevatten om diverse aspecten van matchen te controleren. De modifiers worden gespecificeerd als een optionele vlag. U kunt meerdere modifiers specificeren met exclusieve OR (|), zoals eerder getoond en kunnen worden voorgesteld door een van de volgende:
| Nr. | Modifier & Beschrijving |
|---|---|
| 1 | re.I Voert case-insensitive matching uit. |
| 2 | re.L Interpreteert woorden volgens de huidige locale. Deze interpretatie beïnvloedt de alfabetische groep (\w en \W), evenals woordgrensgedrag (\b en \B). |
| 3 | re.M Maakt $ matchen met het einde van een regel (niet alleen het einde van de string) en maakt ^ matchen met het begin van elke regel (niet alleen het begin van de string). |
| 4 | re.S Maakt een punt (dot) matchen met elk teken, inclusief een newline. |
| 5 | re.U Interpreteert letters volgens de Unicode-tekenset. Deze vlag beïnvloedt het gedrag van \w, \W, \b, \B. |
| 6 | re.X Staat "cuter" reguliere expressie syntaxis toe. Het negeert witruimte (behalve binnen een set [] of wanneer geëscaped door een backslash) en behandelt ongescape # als commentaarmarker. |
Reguliere Expressie Patronen
Behalve voor controletekens, (+ ? . * ^ $ ( ) [ ] { } | \), matchen alle tekens zichzelf. U kunt een controlekenken escapen door er een backslash voor te zetten.
De volgende tabel geeft de reguliere expressie-syntax die in Python beschikbaar is:
| Nr. | Patroon & Beschrijving |
|---|---|
| 1 | ^ Matcht begin van regel. |
| 2 | $ Matcht einde van regel. |
| 3 | . Matcht elk enkel teken behalve newline. Met m-optie matcht het ook newline. |
| 4 | [...] Matcht elk enkel teken tussen haakjes. |
| 5 | [^...] Matcht elk enkel teken niet tussen haakjes. |
| 6 | re* Matcht 0 of meer voorkomens van voorgaande expressie. |
| 7 | re+ Matcht 1 of meer voorkomens van voorgaande expressie. |
| 8 | re? Matcht 0 of 1 voorkomen van voorgaande expressie. |
| 9 | re{ n} Matcht precies n aantal voorkomens van voorgaande expressie. |
| 10 | re{ n,} Matcht n of meer voorkomens van voorgaande expressie. |
| 11 | re{ n, m} Matcht ten minste n en ten max m voorkomens van voorgaande expressie. |
| 12 | a| b Matcht ofwel a ofwel b. |
| 13 | (re) Groepeert reguliere expressies en onthoudt gematchte tekst. |
| 14 | (?imx) Schakelt tijdelijk i, m, of x opties in binnen een reguliere expressie. Als tussen haakjes, wordt alleen dat gebied beïnvloed. |
| 15 | (?-imx) Schakelt tijdelijk i, m, of x opties uit binnen een reguliere expressie. Als tussen haakjes, wordt alleen dat gebied beïnvloed. |
| 16 | (?: re) Groepeert reguliere expressies zonder gematchte tekst te onthouden. |
| 17 | (?imx: re) Schakelt tijdelijk i, m, of x opties in binnen haakjes. |
| 18 | (?-imx: re) Schakelt tijdelijk i, m, of x opties uit binnen haakjes. |
| 19 | (?#...) Commentaar. |
| 20 | (?= re) Specificeert positie met een patroon. Heeft geen bereik. |
| 21 | (?! re) Specificeert positie met patronenegatie. Heeft geen bereik. |
| 22 | (?> re) Matcht onafhankelijk patroon zonder backtracking. |
| 23 | \w Matcht woordtekens. |
| 24 | \W Matcht niet-woordtekens. |
| 25 | \s Matcht witruimte. Equivalent aan [\t\n\r\f]. |
| 26 | \S Matcht niet-witruimte. |
| 27 | \d Matcht cijfers. Equivalent aan [0-9]. |
| 28 | \D Matcht niet-cijfers. |
| 29 | \A Matcht begin van string. |
| 30 | \Z Matcht einde van string. Als een newline bestaat, matcht het net voor de newline. |
| 31 | \z Matcht einde van string. |
| 32 | \G Matcht punt waar laatste match eindigde. |
| 33 | \b Matcht woordgrenzen wanneer buiten haakjes. Matcht backspace (0x08) wanneer binnen haakjes. |
| 34 | \B Matcht niet-woordgrenzen. |
| 35 | \n, \t, etc. Matcht newlines, carriage returns, tabs, etc. |
| 36 | \1...\9 Matcht nth gegroepeerde subexpressie. |
| 37 | \10 Matcht nth gegroepeerde subexpressie als die al gematcht is. Anders verwijst naar octale representatie van een tekenkode. |
Reguliere Expressie Voorbeelden
Letterlijke tekens
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | python Matcht "python". |
Tekensklassen
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | [Pp]ython Matcht "Python" of "python" |
| 2 | rub[ye] Matcht "ruby" of "rube" |
| 3 | [aeiou] Matcht elk enkele kleine klinker |
| 4 | [0-9] Matcht elk cijfer; hetzelfde als [0123456789] |
| 5 | [a-z] Matcht elk kleine ASCII-letter |
| 6 | [A-Z] Matcht elk hoofdletter ASCII-letter |
| 7 | [a-zA-Z0-9] Matcht elk van de bovenstaande |
| 8 | [^aeiou] Matcht alles behalve een kleine klinker |
| 9 | [^0-9] Matcht alles behalve een cijfer |
Speciale Tekensklassen
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | . Matcht elk teken behalve newline |
| 2 | \d Matcht een cijfer: [0-9] |
| 3 | \D Matcht een niet-cijfer: [^0-9] |
| 4 | \s Matcht een witruimteteken: [ \t\r\n\f] |
| 5 | \S Matcht niet-witruimte: [^ \t\r\n\f] |
| 6 | \w Matcht een enkel woordteken: [A-Za-z0-9_] |
| 7 | \W Matcht een niet-woordteken: [^A-Za-z0-9_] |
Herhalingsgevallen
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | ruby? Matcht "rub" of "ruby": de y is optioneel |
| 2 | ruby* Matcht "rub" plus 0 of meer y's |
| 3 | ruby+ Matcht "rub" plus 1 of meer y's |
| 4 | \d{3} Matcht precies 3 cijfers |
| 5 | \d{3,} Matcht 3 of meer cijfers |
| 6 | \d{3,5} Matcht 3, 4, of 5 cijfers |
Non-greedy herhaling
Dit matcht het kleinste aantal herhalingen:
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | <.*> Greedy herhaling: matcht "<python>perl>" |
| 2 | <.*?> Non-greedy: matcht "<python>" in "<python>perl>" |
Groeperen met Haakjes
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | \D\d+ Geen groep: + herhaalt \d |
| 2 | (\D\d)+ Gegroepeerd: + herhaalt \D\d paar |
| 3 | ([Pp]ython(, )?)+ Matcht "Python", "Python, python, python", etc. |
Backreferences
Dit matcht een eerder gematchte groep opnieuw:
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | ([Pp])ython&\1ails Matcht python&pails of Python&Pails |
| 2 | (['"])[^\1]*\1 Enkel of dubbel aangehaalde string. \1 matcht wat de 1e groep matchte. \2 matcht wat de 2e groep matchte, etc. |
Alternatieven
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | python|perl Matcht "python" of "perl" |
| 2 | rub(y|le)) Matcht "ruby" of "ruble" |
| 3 | Python(!+|\?) "Python" gevolgd door een of meer ! of één ? |
Ankers
Deze moeten de match-positie specificeren.
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | ^Python Matcht "Python" aan het begin van een string of interne regel |
| 2 | Python$ Matcht "Python" aan het einde van een string of regel |
| 3 | \APython Matcht "Python" aan het begin van een string |
| 4 | Python\Z Matcht "Python" aan het einde van een string |
| 5 | \bPython\b Matcht "Python" aan een woordgrens |
| 6 | \brub\B \B is niet-woordgrens: matcht "rub" in "rube" en "ruby" maar niet alleen |
| 7 | Python(?=!) Matcht "Python", als gevolgd door een uitroepteken. |
| 8 | Python(?!!) Matcht "Python", als niet gevolgd door een uitroepteken. |
Speciale Syntaxis met Haakjes
| Nr. | Voorbeeld & Beschrijving |
|---|---|
| 1 | R(?#comment) Matcht "R". De rest is commentaar |
| 2 | R(?i)uby Case-insensitive tijdens matchen van "uby" |
| 3 | R(?i:uby) Hetzelfde als bovenstaand |
| 4 | rub(?:y|le)) Groep alleen zonder \1 backreference aan te maken |
Python
- C# Reguliere Expressies Beheersen: Een Praktische Gids
- 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 Regular Expressions (re-module) – een praktische gids
- Python datetime beheersen: praktische gids voor datums, tijden en tijdzones
- Java Reguliere Expressies: Patroonherkenning onder de knie krijgen met java.util.regex