Een regex (reguliere expressie of regular expression) is eigenlijk een “veralgemeend model” of een patroon van de tekst die je zoekt. Je kan regex zo eenvoudig of ingewikkeld maken als je wil, maar ik raad aan om het zo eenvoudig mogelijk te houden binnen de context van de tekst waarmee je werkt en voor je specifieke doel. Het heeft geen zin om een allesomvattend regex model voor datums te willen opstellen als in je document alleen 01.05.2006 als formaat voorkomt, of als je weet dat er alleen geldige datums instaan en niet zoiets als 35.92.5681 dat je dan niet als datum zou willen behandelen.
Normaal gezien kan je “alles vervangen” doen, je moet niet één voor één voor elke match op vervang klikken tenzij je dat echt wil. Als er iets misloopt kan je altijd “undo”/”ongedaan maken” of CTRL-Z doen na de vervangoperatie.
Ik gebruik Notepad++ om dergelijke regex bewerkingen te doen.
Opm. vooraf:
- Ronde haakjes groeperen wat er tussen staat tot een matchgroep. Die groepen zijn genummerd in volgorde van voorkomen in de regex, zodat je er bij vervanging naar kan verwijzen.
Bij vervangen gebruik ik hier \x, waarbij x het groepsnummer is. In sommige tools moet je $x gebruiken of misschien nog iets anders. Dat moet je even opzoeken of uitproberen voor het programma dat je gebruikt als \x niet werkt.
1. Datums anders formatteren
Bijvoorbeeld alle datums in een lijst omkeren van 01.10.1975 naar 1975.10.01
ZOEK:
(\d\d)\.(\d\d)\.(\d\d\d\d)
\d
staat voor een getal.
Bij \.
is de \ een “escape” teken, om te zorgen dat een letterlijke punt matcht, “.” is namelijk ook een teken dat in regex gebruikt wordt om “eender welk teken” voor te stellen.
Je zou dus ook (\d\d).(\d\d).(\d\d\d\d)
kunnen gebruiken, dat match dan met datums zoals 02-05-1902 en 15/08/1945, maar ook met 00f56;7983. Je moet dus wel best zo specifiek mogelijk zijn, als dat voor jouw doel iets uitmaakt. Als je in plaats van .
een klasse gebruikt zoals [\./-]
dan vang je enkel de datumscheidingstekens . / en – op.
VERVANG DOOR:
\3\.\2\.\1
Je zou ook naar 19751001 kunnen gaan met simpelweg \3\2\1
2. Voorlopernullen toevoegen aan datums
Datums zoals 5-6-1982, 04-7-1945, 3-08-2000 wil je graag omzetten naar een consistente notatie: 05-06-1982, 04-07-1945, 03-08-2000.
Het eenvoudigste doe je dat in twee vervangstappen, één regex voor de dagen en één voor de maanden.
ZOEK alle datums met een dag van één cijfer:
\b(\d)-(\d{1,2})-(\d\d\d\d)\b
\b
staat voor een “woordbegrenzing” dat kan een spatie of een nieuwe regel zijn, of een ander niet-woord teken (waarbij getallen ook woordtekens zijn). Zo vermijd je dat je bijvoorbeeld 004-07-1945 krijgt in ons voorbeeld.\d
staat voor een getal.{1,2}
betekent dat wat ervoor staat 1 tot 2 keer moet voorkomen, hier dus maanden van 1 of 2 cijfers.
VERVANG DOOR:
0\1-\2-\3
En dan opnieuw:
ZOEK alle datums met een maand van één cijfer, we weten dat alle dagen nu uit twee cijfers bestaan:
\b(\d\d)-(\d)-(\d\d\d\d)\b
VERVANG DOOR:
\1-0\2-\3
3. Adressen anders formatteren
In de directory van het FOMU worden adressen als volgt geformatteerd
1866 - 1873 Bruxelles, Rue d'Arenberg, 1
Op mijn overzichtspagina van kooldrukfotografen wilde ik ze zo formatteren:
Rue d'Arenberg 1 (1866 - 1873), Bruxelles
Je kan die adressen dan allemaal manueel gaan aanpassen, maar met een regex zoek en vervangopdracht is dat zo gebeurd:
ZOEK (regex):^([\d ?-]+) ([A-Za-zèàé.-]+), ([\w' -]+), ([\d/]+)$
“^” is het begin van een regel, “$” is het einde van een regel. “\d” staat voor een getal, “\w” voor een woordkarakter (inclusief cijfers). Tussen [] staat de representatie van één teken, [\d ?-]
staat voor een getal, een spatie, een vraagteken of een koppelteken. [A-Za-zèàé.-]
staat voor de hoofdletters A tot Z, de kleine letters a tot z, de letters è, à en é, een punt of een koppelteken.
“+” erachter betekent dat alles tussen de [] één of meer keer moet voorkomen. “*” is nul of meer keer, “?” is nul of één keer.
Daarmee omschrijft deze regex het adresformaat van het FOMU:
- de jaartallen.
^([\d ?-]+)
aan het begin van de regel getallen waartussen ook spaties en vraagtekens kunnen staan, gevolgd door een spatie. - de gemeente.
([A-Za-zèàé.-]+),
deze mogelijke tekens: hoofdletters A tot Z, de kleine letters a tot z, de letters è, à en é, een punt of een koppelteken. Gevolgd door een komma en een spatie. - de straat.
([\w' -]+),
deze mogelijke tekens: cijfers en letters, apostrof, spatie of koppelteken. Gevolgd door een komma en een spatie. - het huisnummer.
([\d/]+)$
aan het einde van de regel getallen of / (om huisnummer 85/2 op te vangen).
VERVANG DOOR:\3 \4 \(\1\), \2
De \1, \2 enz. verwijzen naar de groepen tussen haakjes in de regex.
\1 verwijst naar de eerste groep “([\d ?-]+)”. Alles wat daarin past komt dus op de plaats van \1 in het resultaat: \(\1\)
: de datums tussen haakjes. In \( en \) is de \ een “escape” teken, zodat de haakjes letterlijk geïnterpreteerd worden (dat is niet bij alle regex tools nodig). Jee moet dat dus bekijken als (\1), de eerste matchgroep tussen haakjes zetten.
Zo krijg je het nieuwe adresformaat.
4. Lijst maken van “geOCRde” index met paginanummers
Om oude gedrukte genalogische bewerkingen digitaal te ontsluiten kan je beginnen met de index uit zo’n werk te scannen met OCROCR of optische karakterherkenning zet een digitale foto van.... Met enkele regex zet je die dan snel om in een lijst namen.
Na OCROCR of optische karakterherkenning zet een digitale foto van... en correctie van de fouten:
Van Triel 20 Van Valkenborg 29 Van Wille 23 Vanaerden 7 Vande Bie 17 27 Vande Wouwer 27 Vanden Bergh 8 17 25 26 Vanden Brande 12 17 27 28 Vanden Poel 13 Vanden Wyngaert 17 Vander Bist 14 Vandergoden 22 Vavero 21
Nu willen we daar een lijst van maken zonder de getallen erachter.
ZOEK getallen+spaties op het einde van de regel:
[\d ]+$
VERVANGEN DOOR niets (laat dat vakje gewoon leeg).
Na een klik op “alles vervangen” is het meteen in orde, of je lijst nu 10 namen of 10 bladzijden met namen lang is.
Van Triel Van Valkenborg Van Wille Vanaerden Vande Bie Vande Wouwer Vanden Bergh Vanden Brande Vanden Poel Vanden Wyngaert Vander Bist Vandergoden Vavero
Als de paginanummers met komma’s gescheiden zijn (6, 12, 31) dan voeg je een komma toe aan de klasse: [\d ,]+$
Wat doe je met onderstaande index?
Adriaens 1, 8, 20 ; Aerts 2, 3, 8, 9, 15—19 ; Anthonissen 22 ; Beeten 3 ; Barets 3 ; Bartholomeus 7 ; Beijens 6 ; Bellemans 11, 13, 18, 20, 21 ; Bellens 13, 14, 18, 21 ; Berckmans 20 ; Berger 2, 7 ; Berrevoets 3 ; Ber— tels 17, 20 ; Billion 6 ; Blanckaers 8 ; Bloinne 8 ; Boeckmans 6 ; Boecx 20 ; Boelens 6, 9 ; Boels 8 ; Bomgaerts 6 ; Boogaers 10 ; Boogaerts 3, 14 ; Boon 21 ; Boonen 3 ; Boret 11 ; Bosch 12, 17, 18, 20, 21 ; Boset 11 ; Bosgaers 18 ; Bosgaerts 15, 17 ; Bosmans 14, 15 ; Bosquet 3 ; Breugelmans 2 ; Briers 8 ; Broeck 1 ; Broelinck 12 ; Bruijndoncx 11, 16 ; Bruijnseels 9, 10, 16, 17 ; Bultiens 19 ; Caers 3 ; Claes 16, 17 ; Clé 16 ; Clijnen 16 ; Cocké 16 ; Coolkens 11, 17, 19 ; Cools 18 ; Coonians 4—6, 9 ; Corthoudt 20, 21 ; Courant 6 ; Cuijnen 11 ; Cuijpers 16, 20 ; Cuijvers 6 ; Dams 6, 7, 10, 13, 15, 19, 21 ; Danckens 18 ; Danckers 15 ; Dassen 6, 20 ; De Backer 4, 7, 12, 21, 22 ; De Bie 7, 22 ; De Boeck 2 ; De Boel 21 ; De Brie 15 ; De Bruijn 20 ; De Busser 9 ; De Ceulaer 4, 18 ; De Coninck 23 ; De Cort 21 ;
We brengen eerst de namen die over twee regels verdeeld zijn bij elkaar. Dat is nodig vermits we straks een lijst maken met op elke regel een naam, er mogen dus geen regeleindes meer binnenin een naam staan.
Dat gaat het gemakkelijkste in twee keer. We zoeken telkens twee letters waartussen een regeleinde staat [\r\n]+
(één of meer carriage returns of new lines) en in het eerste geval ook een koppelteken.
Het is nuttig om te weten dat er verschillende tekens zijn die als koppelteken kunnen worden ingevoegd door OCROCR of optische karakterherkenning zet een digitale foto van.... Hier komt er naast het gewone minteken ook deze langere streep uit: —
. Je moet altijd zorgen dat het gewone koppelteken (het minteken) als laatste staat tussen de vierkante haken, anders wordt het geïnterpreteerd als een bereik, zoals a-z (a tot z).
Voor de namen met koppelteken:
ZOEK ([a-zA-Z])[—-][\r\n]+([a-zA-Z])
VERVANG \1\2
gewoon aan elkaar plakken zonder spatie
Voor de namen met spaties:
ZOEK ([a-zA-Z])[\r\n]+([a-zA-Z])
VERVANG \1 \2
aan elkaar plakken met spatie
Nu gaan we elke naam op een nieuwe regel laten beginnen door de paginanummers te vervangen door een regeleinde.
ZOEK getallen, spaties, koppeltekens, nieuwe regeltekens en kommas voor een puntkomma:
\s[\d\s,—-]+?;\s*
VERVANGEN DOOR \r\n
een regeleinde
Adriaens Aerts Anthonissen Beeten Barets Bartholomeus Beijens Bellemans Bellens Berckmans Berger Berrevoets Bertels Billion Blanckaers Bloinne Boeckmans Boecx Boelens Boels Bomgaerts Boogaers Boogaerts Boon Boonen Boret Bosch Boset Bosgaers Bosgaerts Bosmans Bosquet Breugelmans Briers Broeck Broelinck Bruijndoncx Bruijnseels Bultiens Caers Claes Clé Clijnen Cocké Coolkens Cools Coonians Corthoudt Courant Cuijnen Cuijpers Cuijvers Dams Danckens Danckers Dassen De Backer De Bie De Boeck De Boel De Brie De Bruijn De Busser De Ceulaer De Coninck De Cort
Je zou ook de paginanummers kunnen behouden en er meteen een tabel van maken met twee kolommen.
Dan moet je eerst zorgen dat de lijsten met paginanummers niet over twee regels lopen, zoals we met namen gedaan hebben:
ZOEK (\d,?)[\r\n]+([\d;])
een getal eventueel gevolgd door een komma, gevolgd door een of meer regeleindes gevolgd door een getal of een puntkomma.
VERVANG \1 \2
aan elkaar plakken met spatie
En vervolgens de lijst paginanummers in een groep steken, met ronde haakjes omringen dus. Zodat je die kunt hergebruiken in de vervangopdracht. Daarin kan je dan de namen en paginanummers scheiden met een TAB teken \t
(dat importeert makkelijk als tabel in Excel) of met een puntkomma, of iets anders.
ZOEK \s([\d\s,—-]+?);\s*
zelfde als voorheen, maar met haakjes rond de paginanummerlijst.
VERVANG \t
\1\r\n zet ook een TAB tussen de naam en de nummers
Adriaens 1, 8, 20 Aerts 2, 3, 8, 9, 15—19 Anthonissen 22 Beeten 3 Barets 3 Bartholomeus 7 Beijens 6 Bellemans 11, 13, 18, 20, 21 Bellens 13, 14, 18, 21 Berckmans 20 Berger 2, 7 Berrevoets 3 Bertels 17, 20 Billion 6 Blanckaers 8 Bloinne 8 Boeckmans 6 Boecx 20 Boelens 6, 9 Boels 8 Bomgaerts 6 Boogaers 10 Boogaerts 3, 14 Boon 21 Boonen 3 Boret 11 Bosch 12, 17, 18, 20, 21 Boset 11 Bosgaers 18 Bosgaerts 15, 17 Bosmans 14, 15 Bosquet 3 Breugelmans 2 Briers 8 Broeck 1 Broelinck 12 Bruijndoncx 11, 16 Bruijnseels 9, 10, 16, 17 Bultiens 19 Caers 3 Claes 16, 17 Clé 16 Clijnen 16 Cocké 16 Coolkens 11, 17, 19 Cools 18 Coonians 4—6, 9 Corthoudt 20, 21 Courant 6 Cuijnen 11 Cuijpers 16, 20 Cuijvers 6 Dams 6, 7, 10, 13, 15, 19, 21 Danckens 18 Danckers 15 Dassen 6, 20 De Backer 4, 7, 12, 21, 22 De Bie 7, 22 De Boeck 2 De Boel 21 De Brie 15 De Bruijn 20 De Busser 9 De Ceulaer 4, 18 De Coninck 23 De Cort 21
Deze lijst kan je gewoon in Excel plakken en je krijgt twee kolommen.