Cet article a été rédigé à la suite du séminaire du 28 novembre 2017 – “Manipuler du texte avec les expressions régulières” par Pierre-Guillaume Prigent, Jean-Baptiste Pressac et Sébastien de Villèle. Pour une introduction aux expressions régulières avec des exemples d’utilisation avec R, vus consulterez avec profit le Notebook https://github.com/pgtpg/jupyter-regex-ubo/blob/master/Regex.ipynb.
Pour un cas d’utilisation avancé des expressions régulières avec LibreOffice, nous vous conseillons la lecture de Understanding Regular Expressions écrit par Doug Knox et publié le 22 juin 2013 sur la revue en ligne The Programming Historian (ISSN: 2397-2068). Dans cet article, Doug propose une utilisation astucieuse de LibreOffice et des expressions régulières pour transformer en tableau des données issues de l’océrisation d’un document.
Pour savoir comment changer le format de dates de YYYY-MM-DD vers MM/DD/YYYY, consultez Backreferences in replacements.
Les expressions régulières, à quoi ça sert ?
Selon Wikipédia, en informatique, une expression régulière (regex en abrégé) est une chaîne de caractères qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise. D’accord, mais à quoi ça ressemble et à quoi ça sert ?
Tout d’abord, il faut savoir que les expressions régulières sont partout. Ils sont notamment utilisés dans tout formulaire de saisie de données sur internet. Par exemple dans votre formulaire de réservation d’un billet de train pour vérifier que vous avez saisi votre date de départ ou votre courriel au bon format. D’une manière générale, les expression régulières sont utilisées partout où un ordinateur a besoin de vérifier qu’une chaine de caractères est conforme à un format générique de données.
Par contre, les expressions régulières traitent les chaînes de caractères et non pas leur sémantique. Dans le cas du mois du départ de votre train, l’expression régulière ne permet au serveur de réservation que de vérifier que ce que vous avez saisi est un chiffre entre 1 et 12, il ne vérifie pas qu’il s’agit d’un “mois” de l’année.
Si les expressions régulières sont un des outils du développeur informatique ou de l’analyste de données dans son usage d’un langage de programmation, vous pouvez aussi l’utiliser dans des logiciels tels que Notepad++ ou LibreOffice/OpenOffice pour faire des rechercher-remplacer avancés.
Recherche avancée dans LibreOffice et OpenOffice
Admettons qu’un collègue vous ai transmis un document Word contenant des informations concernant les années entre 1800 et 2000. Les informations ne sont pas réparties de manière chronologiques et vous voulez chercher toutes les informations concernant les années entre 1850 et 1899. Première solution : Vous faites une recherche avec votre logiciel de traitement de texte sur “1850”, puis “1851”, “1852”, etc., jusqu’à “1899”. Deuxième solution plus rapide : Vous ouvrez le document avec LibreOffice ou OpenOffice et dans la fenêtre de Rechercher & remplacer, vous cochez la case Expressions régulières sous Autres options et vous faites une recherche avec l’expression régulière 18[5-9][0-9].
Capture d’écran de la fenêtre Rechercher & remplacer de LibreOffice, configuré pour rechercher avec une expression régulière
En cochant la case Expressions régulières dans la fenêtre de recherche de LibreOffice vous lui précisez qu’il doit traiter la chaine de caractères 18[5-9][0-9] comme une expression régulière. Si vous oubliez de le faire, il se contentera de chercher les occurrences de la chaine de caractères “18[5-9][0-9]”. Soit 1 suivit de 8 suivit de [ suivit de 5, etc. Si vous cochez la case, donc, LibreOffice cherchera des chaines de caractères qui commencent par 18 suivit d’un chiffre entre 5 et 9 (comme indiqué entre crochets) suivit d’un chiffre entre 0 et 9, soit “1850”, “1857”, “1876”, “1883”, etc. Magique, non ?
Mais n’y voyez pas là une recherche sémantique. L’expression régulière ne permet pas de rechercher dans notre cas des années, ni des chiffres compris entre 1850 et 1899 mais des suites de caractères informatiques. Aussi, l’expression régulière 18[5-9][0-9]
trouvera aussi “1856” et “1809” dans la phrase “Ce projet nous aura couté 1856 euros et mobilisé 1809 personnes.”
Autre exemple, si vous cherchez des courriels dans votre document Word avec LibreOffice, vous pouvez utiliser l’expression régulière :
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+
Pour comprendre en détail cette expression régulière, je vous invite à consulter la partie “Bases de la syntaxe” du billet de blog Les expressions régulières : le super rechercher-remplacer. En attendant, le graphique ci-dessous peut vous aider à l’interpréter.
Interprétation graphique de la regex [a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+ (Généré depuis https://regexper.com)
Comme vous pouvez le constater, ça peut rapidement se corser. Car il n’y a pas de miracles, ce sera à vous de trouver le “motif” qui correspond le mieux à ce vous voulez chercher. A vrai dire, il existe de nombreux sites internet où vous pouvez trouver les motifs (l’autre petit nom des expressions régulières) les plus courants et je ne vous cache pas que j’ai trouvé ce motif possible pour les courriels après une recherche dans DuckDuckGo avec les mots clefs “regex email”
.
Par contre, si vous trouvez une expression régulière sur internet, elle peut ne pas convenir telle quelle pour LibreOffice. Par exemple, sur le site http://emailregex.com/, l’expression régulière pour les courriels est donné pour le langage de programmation Python :
r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
Pour l’utiliser dans le formulaire de recherche de LibreOffice, il faut retirer le r du début et les guillemets. Et cela n’a rien à voir avec Python, mais il faut aussi retirer le ^
après la parenthèse et le $
final, sinon seuls les courriels écrits tout seuls sur une ligne seront pris en compte (par exemple seul le courriel sheriff@nottingham.uk sera sélectionné dans le texte ci-dessous).
Contactez moi à l’adresse robindesbois@nottingham.uk.
sheriff@nottingham.uk
Je mangerai bien une pomme avec Petit Jean, je lui envoie un mail à petitjean@nottingham.uk …
Par ailleurs, j’ai parlé d’une expression possible car il n’existe pas qu’un seul motif pour trouver une chaîne de caractères, surtout en matière de courriels, où les normes qui les définissent peuvent changer. Mais ce n’est pas qu’une question de normes. Vous avez peut-être remarqué la case à cocher “Respecter la case” sous la zone de saisie “Rechercher” ? Cette fonctionnalité qui permet de préciser à LibreOffice s’il doit tenir compte ou pas des majuscules et des minuscules lors d’une recherche classique reste valide pour les expressions régulières. Si elle est décochée, elle vous évite de devoir préciser dans l’expression régulière que vous acceptez les majuscules, c’est à dire de préciser A-Z
en plus de a-z
. L’expression régulière de recherche des courriels peut alors s’écrire de la façon suivante :
[a-z0-9_.+-]+@[a-z0-9-]+\.[a-z0-9-.]+
au lieu de :
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+
Par contre, si la case est cochée, les mails contenant des caractères en majuscules ne seront pas trouvés.
Dans l’expression régulière pour Python nous avions retiré le le ^
du début et le $
final. Ils servent dans le cas d’une utilisation dans LibreOffice ou OpenOffice à désigner respectivement le début et la fin d’un paragraphe. C’est à dire que l’expression régulière suivante permettra de trouver des paragraphes qui ne contiennent que des courriels.
^[a-z0-9_.+-]+@[a-z0-9-]+\.[a-z0-9-.]+$
On aurait aussi pu écrire l’expression régulière suivante pour trouver des courriels qui commencent un paragraphe (remarquez l’absence du $ final) :
^[a-z0-9_.+-]+@[a-z0-9-]+\.[a-z0-9-.]+
Supprimer les paragraphes vides avec un chercher-remplacer
Il y a un cas d’utilisation de ^
et $
qui devrait vous plaire : la suppression des paragraphes vides. Quand on copie-colle du texte dans un traitement de texte, il arrive qu’on se retrouve avec des paragraphes vides non désirés. Pour les supprimer, rien de plus facile, faites une recherche avec l’expression régulière suivante, qui désigne un paragraphe vide, tout en laissant vide la zone “Remplacer”.
^$
Remplacer des retours à la ligne par des sauts de paragraphes
On peut aussi remplacer des retours à la ligne (⮠ ) par des fins de paragraphes (¶). Vous créez un retour à la ligne lorsque vous utilisez Shift
+ Entrée
au lieu de la touche Entrée
, qui crée un nouveau paragraphe. Quand vous affichez les marques de formatage, les retours à la lignes correspondent au symbole ⮠ et les fins de paragraphe au symbole ¶.
A quelle expression régulière correspond les sauts de ligne ? Pour répondre à cette question, il faut se référer à la documentation en ligne de LibreOffice qui indique que \n
(i.e. line feed, caractère Unicode U+000A) peut être utilisé dans Rechercher pour trouver les sauts de ligne mais aussi dans Remplacer pour remplacer ce qui a été trouvé par un saut de paragraphe. On saisira donc dans Rechercher & remplacer :
C’est donc un peu étrange mais dans LibreOffice, on utilise bien le même caractère pour rechercher les fins de lignes et les remplacer par des sauts de paragraphes.
Si vous voulez faire l’inverse par contre, c’est à dire remplacer des sauts de paragraphes par des retours à la ligne, vous ne pourrez pas le faire avec LibreOffice car ce dernier ne propose pas d’expressions régulières pour remplacer quelque-chose par un retour à la ligne.
Quelques conseils pour conclure
N’oubliez pas que les expressions régulières ne permettent que de chercher des chaines de caractères. Elles ne cherchent pas des dates, des courriels, des adresses web mais des chaines de caractères qui correspondent, selon vous ou selon la personne qui a écrit le motif, à des dates, des courriels, des adresses web… Ce qui fait que si dans un texte on peut trouver la date 12/5/18 et la division de 12 par 5 puis par 18 écrit de la même manière, l’expression régulière \<[:digit:]{1,2}/[:digit:]{1,2}/[:digit:]{1,2}\>
trouvera la date et l’opération mathématique.
Si vous trouvez une expression régulière sur internet, n’oubliez pas qu’elle ne marchera pas forcément telle quelle dans le logiciel ou avec le langage de programmation que vous utilisez. Quelques ajustements seront parfois nécessaires. D’où le dernier le conseil : lisez la documentation de votre logiciel.
Pour en savoir plus