
Introduction aux expressions régulières
Découvrez les expressions régulières (regex) en Python. Apprenez ce qu'elles sont, à quoi elles servent, et comment les utiliser pour rechercher, extraire et manipuler des motifs dans des chaînes de caractères.
Qu'est-ce qu'une expression régulière ? Définition et concept
Une expression régulière (ou "regex", abréviation de "regular expression") est une séquence de caractères qui définit un *motif de recherche*. Ce motif peut être utilisé pour rechercher, extraire, ou remplacer des portions de texte dans une chaîne de caractères.
Les expressions régulières sont un outil puissant et flexible pour la manipulation de texte. Elles sont utilisées dans de nombreux langages de programmation et dans de nombreux outils (éditeurs de texte, outils de recherche, etc.).
Imaginez que vous ayez une grande quantité de texte et que vous vouliez trouver toutes les adresses e-mail, ou tous les numéros de téléphone, ou toutes les dates. Vous pourriez écrire du code Python pour parcourir le texte caractère par caractère, en essayant de détecter ces éléments. Mais ce serait long, fastidieux, et sujet aux erreurs.
Avec une expression régulière, vous pouvez définir un *motif* qui décrit à quoi ressemble une adresse e-mail, un numéro de téléphone, ou une date. Vous pouvez ensuite utiliser ce motif pour rechercher toutes les occurrences de ce motif dans le texte, en une seule opération.
Les expressions régulières peuvent sembler cryptiques au début, mais elles sont extrêmement utiles une fois que vous avez compris les bases.
A quoi servent les expressions régulières ? Cas d'utilisation
Les expressions régulières sont utilisées dans de nombreux contextes, notamment :
- Validation de données : Vérifier si une chaîne de caractères correspond à un format attendu (par exemple, une adresse e-mail, un numéro de téléphone, une date, un code postal, etc.).
- Recherche et extraction d'informations : Trouver toutes les occurrences d'un motif dans un texte (par exemple, extraire toutes les adresses e-mail d'un document, tous les liens d'une page HTML, etc.).
- Remplacement de texte : Remplacer toutes les occurrences d'un motif par une autre chaîne (par exemple, remplacer toutes les dates au format JJ/MM/AAAA par des dates au format AAAA-MM-JJ).
- Analyse syntaxique (parsing) : Analyser des fichiers de configuration, des fichiers journaux, ou d'autres types de données textuelles structurées.
- Nettoyage de données : Supprimer les caractères indésirables, normaliser les espaces, etc.
- Mise en forme de texte : Appliquer des transformations à du texte (par exemple, mettre en majuscules la première lettre de chaque mot).
Les expressions régulières sont un outil polyvalent qui peut vous faire gagner beaucoup de temps et d'efforts lorsque vous travaillez avec du texte.
Le module re : l'outil Python pour les expressions régulières
En Python, les expressions régulières sont gérées par le module `re` (pour "regular expressions") de la bibliothèque standard.
Pour utiliser les expressions régulières, vous devez d'abord importer le module `re` :
import reLe module `re` fournit des fonctions pour :
- Rechercher un motif dans une chaîne.
- Vérifier si une chaîne correspond à un motif.
- Extraire des portions de chaîne qui correspondent à un motif.
- Remplacer des portions de chaîne qui correspondent à un motif.
- Diviser une chaîne en fonction d'un motif.
- Et plus encore...
Nous explorerons les principales fonctions du module `re` dans les sections suivantes.
Un premier exemple simple : rechercher un mot
Commençons par un exemple simple : rechercher le mot "Python" dans une chaîne de caractères.
import re
texte = "J'aime programmer en Python et utiliser des regex."
motif = "Python"
# Recherche du motif dans le texte
resultat = re.search(motif, texte)
if resultat:
print("Motif trouvé !")
print("Position de départ :", resultat.start())
print("Position de fin :", resultat.end())
print("Partie correspondante :", resultat.group(0))
else:
print("Motif non trouvé.")Dans cet exemple :
- `re.search(motif, texte)` recherche le `motif` ("Python") dans la chaîne `texte`.
- Si le motif est trouvé, `re.search()` retourne un objet *Match*.
- Si le motif n'est pas trouvé, `re.search()` retourne `None`.
- L'objet *Match* contient des informations sur la correspondance : la position de départ (`start()`), la position de fin (`end()`), et la partie de la chaîne qui correspond au motif (`group(0)`).
Pour l'instant, le motif est une simple chaîne de caractères. La puissance des expressions régulières vient du fait que le motif peut être beaucoup plus complexe qu'un simple mot.
Caractères spéciaux et métacaractères : la syntaxe des regex
La syntaxe des expressions régulières utilise des *caractères spéciaux* (ou *métacaractères*) pour définir des motifs plus complexes que de simples chaînes de caractères.
Voici quelques exemples de caractères spéciaux courants :
- `.` (point) : Correspond à n'importe quel caractère (sauf un saut de ligne, par défaut).
- `*` (astérisque) : Correspond à zéro, une ou plusieurs répétitions du caractère ou du groupe précédent.
- `+` (plus) : Correspond à une ou plusieurs répétitions du caractère ou du groupe précédent.
- `?` (point d'interrogation) : Correspond à zéro ou une répétition du caractère ou du groupe précédent. Peut aussi rendre un quantificateur non gourmand (voir plus loin).
- `[]` (crochets) : Définit une classe de caractères (un ensemble de caractères possibles). Par exemple, `[abc]` correspond à `a`, `b`, ou `c`. `[a-z]` correspond à n'importe quelle lettre minuscule.
- `^` (circonflexe) : A l'intérieur de crochets, `^` signifie "n'importe quel caractère *sauf* ceux-ci". Par exemple, `[^abc]` correspond à n'importe quel caractère sauf `a`, `b`, ou `c`. En dehors des crochets, `^` correspond au début de la chaîne.
- `$` (dollar) : Correspond à la fin de la chaîne.
- `\` (antislash) : Permet d'échapper un caractère spécial (pour qu'il soit interprété littéralement), ou introduit une séquence spéciale (voir plus loin).
- `|` (barre verticale) : Correspond à l'un ou l'autre des motifs (alternative). Par exemple, `a|b` correspond à `a` ou `b`.
- `()` (parenthèses) : Définit un groupe de capture (voir plus loin).
Ces caractères spéciaux permettent de créer des motifs très puissants et flexibles. Par exemple :
- `a.c` correspond à "abc", "adc", "a1c", etc.
- `ab*` correspond à "a", "ab", "abb", "abbb", etc.
- `ab+` correspond à "ab", "abb", "abbb", etc. (mais pas "a").
- `ab?` correspond à "a" ou "ab".
- `[0-9]+` correspond à une séquence d'un ou plusieurs chiffres.
- `^Bonjour` correspond à une chaîne qui commence par "Bonjour".
- `fin$` correspond à une chaîne qui se termine par "fin".
Il existe de nombreuses autres séquences spéciales et options de formatage. Nous les aborderons dans les sections suivantes.