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:

  1. de jaartallen. ^([\d ?-]+) aan het begin van de regel getallen waartussen ook spaties en vraagtekens kunnen staan, gevolgd door een spatie.
  2. 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.
  3. de straat. ([\w' -]+), deze mogelijke tekens: cijfers en letters, apostrof, spatie of koppelteken. Gevolgd door een komma en een spatie.
  4. 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 OCR. Met enkele regex zet je die dan snel om in een lijst namen.

Na OCR 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 OCR. 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.

De foto’s uit mijn collectie zijn in principe niet te koop, maar een ernstig bod kan ik altijd in overweging nemen.