Regular expressions (regex) in Python

Stel dat je bepaalde patronen zoekt in een stuk tekst, zoals een telefoonnummer of emailadres. Regular Expression (regex) kunnen je hierbij helpen. Hieronder wat handigheidjes die je kunt gebruiken bij het definiëren van een regex in Python.

## Regex characters en greedy en nongreedy matching ##
() = groep
(?:) = non capturing groep; hiermee kun je icm de .findall method de gehele match retourneren, ipv alleen datgene wat in de groep staat. Een voorbeeld: re.compile(r'(?:\d\d\d)?\d\d\d\d\d\d\d\d\d\d').
 
? = 0 of 1. re.compile(r'(la)?') nu moet 'la' 0 of 1 keer voorkomen om als resultante hieruit te rollen. 
+ = 1 of meer; de regex MOET in ieder geval 1 keer voorkomen. Dus wanneer je re.compile(r'Bat(wo)+man') hebt, dan zal 'Batman' niet gevonden worden omdat de groep (wo) 1 keer MOET voorkomen.
* = 0 of meer.
{x} = de groep moet x keer voorkomen, bijvoorbeeld: re.compile(r'(la){4}').
{x,y} = de groep moet minimaal x keer voorkomen, maar maximaal y keer. {:y} en {x:} respectievelijk de string moet van 0 tot y keer voorkomen of van x tot oneindig keer voorkomen. Python zal per default greedy matchen: bij re.compile(r'(\d){2,3}') zal er in het geval van een te doorzoeken string zoals deze 1234567 voor 3 keer voorkomen gekozen worden ipv 2 keer. Het resultaat zou dus 123 zijn, en niet 12. Wanneer je een nongreedy match wilt, moet je dit typen {2,3}? Het resultaat zal dan 12 zijn en niet 123. Het ? betekent dus wat anders wanneer je het  een {x,y} plaatst, ipv na een groep.
| = dit betekent of. re.compile(r'(0031|\+31) 6 12345678') betekent dus 0031 OF +31
 
\d = een digit ofwel, een cijfer (van 0 t/m 9). Je zou ook re.compile(r'0|1|2|4|5|6|7|8|9') kunnen typen (0 of 1 of 2, etc.)
\D = een character wat GEEN digit is oftewel, alle andere charachters dan een digit.
\w = een letter (denk aan woord), digit of een underscore.
\W = een character wat GEEN letter, digit of een underscore is.
\s = een space, tab of newline ofwel enter.
\S = een character wat GEEN space, tab of newline is.
[xyz] = je eigen regex maken. re.compile(r'[xyz]') is hetzelfde als re.compile(r'(x|y|z)'). Wanneer je ook alle uppercase wilt kan dit zo: [xyzXYZ]. Je hoeft characters als punten overigens niet te escapen binnen de []. 
[a-z] = alle lowercase letters in het alfabet. 
[^xyz] = vind alles BEHALVE xyz.
[xyz]{2} = vind ALLEEN xyz als het twee keer na elkaar voorkomt zoals in de string 'xyzxyz'. Bij 'xyzxyzxyz' zal dus alleen 'xyzxyz' geretourneerd worden. 
^ aan het begin van regex = de match MOET aan het begin van de te onderzoeken tekst zijn. re.compile(r'^wijk') in de tekst 'wijk uit naar kerkwijk', zal alleen resulteren in de eerste wijk, ondanks dat er ook een tweede te vinden is aan het einde van de string.
$ aan het einde van de regex = de match MOET aan het einde van de te onderzoeken tekst zijn. re.compile(r'lijk$') in de tekst 'lijk jij op een lijk', zal alleen resulteren in de laatste lijk, ondanks dat er aan de aanvang ook lijk te vinden is. 
^xyz$ = 'xyz' moet aan het begin en het einde van de te onderzoeken tekst te vinden zijn. Met andere woorden, met re.compile(r'^xyz$') mag de enige tekst 'xyz' zijn in de te onderzoeken tekst, anders is het resultaat None. 
. = alles behalve een new line. Met één . wordt er slechts naar één character gezocht: re.compile(r'.at').findall('flat, kat, pat ,,lat vat') resulteert in ['lat', 'kat', 'pat', 'lat', 'vat']. re.compile(r'.*at') resulteert in ['flat, kat, pat ,,lat vat'].
.* = vind alles behalve een new line \n. .* is greedy. .*? is nongreedy. 
re.compile(r'.*', re.DOTALL) = vind alles, inclusief een new line. 
re.compile(r'xyz', re.IGNORECASE) = vind 'xyz' in lower- en uppercase. re.compile(r'xyz', re.I) doet hetzelfde.
re.compile(r'xyz', re.VERBOSE) = mbv re.VERBOSE en drie apostrophes kun je de regex over meerdere regels verdelen en whitespaces toevoegen zodat je makkelijker comments toe kunt voegen aan onderdelen van de regex. 
re.compile(r'xyz', re.DOTALL | re.IGNORECASE | re.VERBOSE) = meerdere opties toevoegen aan tweede argument van compile function mbv |.

Leave Comment

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *