Introduction aux expressions régulières avec LibreOffice

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 & remplacer1, 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, etc2. 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 informatiques3. 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éter4.

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 »5.

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 changer6. 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 paragraphe7. 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 lignes vides avec un chercher-remplacer

Il y a un cas d’utilisation de ^ et $ qui devrait vous plaire : la suppression des lignes vides. Quand on copie-colle du texte dans un traitement de texte, il arrive qu’on se retrouve avec des lignes vides non désirées. Pour les supprimer, rien de plus facile, faites une recherche avec l’expression régulière suivante, qui désigne une ligne vide, tout en laissant vide la zone « Remplacer ».

^$

Remplacer des retours à la ligne par des sauts de paragraphes

Si on peut supprimer des lignes vides avec des expressions régulières, on peut aussi remplacer des retours à la ligne () par des sauts de paragraphes (¶8). 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 formatage9, les retours à la lignes correspondent au symbole ⮠  et les sauts de paragraphe au symbole ¶.

Nous avons vu que l’expression régulière ^ correspond à une fin de paragraphe mais à quelle expression 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 peut être utilisé dans Rechercher pour trouver les sauts de ligne et dans Remplacer pour remplacer ce qui a été trouvé par un saut de paragraphe. On saisira donc dans Rechercher & remplacer :

Pour remlacer un saut de ligne par un saut de paragraphe dans LibreOffice, il faut utiliser \n dans le champ Rechercher et dans le champ Remplacer de la fonction Rechercher & remplacer et cocher la case Expressions régulières.

Si vous voulez faire l’inverse par contre, c’est à dire remplacer des sauts de paragraphes par des sauts 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

  1. Menu Édition > Rechercher & remplacer (Ctrl + H). []
  2. Ce qui permettrai de trouver les occurrences de 18[5-9][0-9] en collant le billet de ce blog dans un fichier de LibreOffice. []
  3. L’expression régulière 18[5-9][0-9] ne désigne pas les chiffres de 1850 à 1899 mais les caractères « 1 » puis « 8 » puis de « 5 » à « 9 » puis de « 0 » à « 9 ». []
  4. Le graphique a été généré sur le site https://regexper.com/ développé par Jeff Avallone (https://github.com/javallone). []
  5. La source de la regex pour trouver des courriels est https://emailregex.com/. []
  6. Lire à propos de la quête de la meilleure expression régulière pour les courriels How to Find or Validate an Email Address par Jan Goyvaerts. []
  7. Dans le cas d’une utilisation des expressions régulières avec un langage de programmation comme Python ou R, ^ et $ servent à désigner le début et la fin d’une chaîne de caractères. []
  8. Le symbole du paragraphe dans les traitements de texte, ¶ s’appelle en anglais pilcrow sign ou pied-de-mouche en français. []
  9. Pour afficher les marques de formatage dans LibreOffice, allez dans le menu « Affichage » et cochez « Marques de formatage ». []

Séance du 8 décembre 2015 – OpenRefine, mes données à la machine

La séance du 8 décembre 2015 du cycle de rencontres et d’échanges autour du traitement et de l’analyse quantitative de données en SHS a été consacrée à la présentation du logiciel OpenRefine par Jean-Baptiste Pressac chargé des bases de données de recherche et de projets de numérisation au CRBC.

Avant l’exploitation statistique ou la diffusion de données alphanumériques1 stockées dans divers formats tabulaires ou en XML2 , il est souvent nécessaire de les « nettoyer » et de les transformer :
– Supprimer des doublons
– Ventiler les données saisies dans le même champ (par ex. un champ « activité » qui contiendrait une liste d’activités séparées par des barres obliques. Par ex. : « documentation/analyse de données/gestion »)
– Supprimer des caractères indésirables (par ex. des espaces en trop)
– Rassembler des données de même valeur (par ex. « Amérique », « USA », « U.S.A », « États-Unis »)
– Aligner les données avec des référentiels (par ex. le Sudoc, Wikidata)

Des tâches qui peuvent être effectuées à l’aide du logiciel gratuit et open source OpenRefine3 que nous avons découvert à travers le nettoyage et la préparation de données issues d’un formulaire d’enquête en sociologie stockées dans un fichier Excel.

Les vidéos de présentation d’OpenRefine (en anglais) sur le compte officiel YouTube du projet constituent une bonne entrée en matière au logiciel. Pour en savoir plus, vous trouverez des informations sur son installation, des cas d’utilisations (des « recettes ») et une abondante liste de tutoriels4 sur la documentation officielle. Notez au passage que la documentation est un wiki auquel vous pouvez participer, ne serait-ce que pour corriger des liens web invalides ou des fautes d’orthographe.

Je vous conseille cependant d’investir dans le livre (en anglais) Using OpenRefine de Ruben Verborgh et Max De Wilde. Il ne coûte que 18 euros en version e-book (PDF, ePub) et a une approche plus structurée et pédagogique que la documentation officielle.

A noter également le forum des utilisateurs sur Google Group.

 

  1. Par données alphanumériques, on entend par exemple l’âge d’individus, leur nom, l’entreprise dans laquelle ils travaillent, leur date d’entrée dans l’entreprise, etc. []
  2. OpenRefine est capable de traiter des données stockées dans divers formats : XLS, XLSX, ODS, CSV, TSV, *SV, XML, RDF-XML, JSON. []
  3. OpenRefine est disponible sous Windows, Mac OS et Linux. Il requiert l’installation du langage Java. []
  4. A lire en français Préparer un corpus de tweets avec open/google Refine pour le visualiser dans Gephi []