Expressions régulières
Mise à jour :
Les expressions régulières, ou regex, c’est un peu comme une langue secrète pour communiquer avec vos données textuelles. Si vous vous êtes déjà demandé comment extraire des adresses e-mail d’un document, vérifier un numéro de téléphone ou remplacer des mots spécifiques dans un texte, les regex sont là pour vous simplifier la vie.
Avec Python, manipuler les regex est un jeu d’enfant grâce au module intégré
re
. Que vous soyez développeur débutant ou expérimenté, apprendre à utiliser
les regex vous ouvrira de nouvelles perspectives pour traiter des chaînes de
caractères de manière rapide et efficace.
Mais pas de panique, je sais que les regex peuvent sembler un peu intimidantes
au départ. Entre les astérisques, les parenthèses, et les mystérieuses séquences
comme \d
ou \w
, on peut vite se sentir perdu. Dans ce guide, je vais vous
accompagner étape par étape, avec des explications claires et des exemples
concrets. Vous verrez, c’est beaucoup plus simple qu’il n’y paraît !
Prêt à plonger dans l’univers fascinant des regex en Python ? Alors, allons-y !
Premier pas
Bonne nouvelle : vous n’avez rien à installer pour utiliser les expressions
régulières en Python ! Le module re
est intégré par défaut dans la
bibliothèque standard de Python. En gros, il est prêt à l’emploi dès que vous
installez Python.
Avant toute chose, on importe simplement le module re
dans notre script. Voici
comment faire :
Et voilà, vous êtes prêt à travailler avec des regex ! Maintenant, passons à l’essentiel : écrire et tester des motifs.
Une regex, c’est un peu comme un détective textuel. Par exemple, si vous voulez trouver le mot “Python” dans une phrase, vous pouvez utiliser cette expression régulière :
Quand vous exécutez ce script, il affichera “Mot trouvé !” si la chaîne contient “Python”. Facile, non ?
Si vous voulez que votre recherche ignore les majuscules et minuscules, ajoutez
l’option re.IGNORECASE
:
Les bases des regex
Pour vraiment comprendre les expressions régulières, il faut se familiariser avec les bases. Les regex utilisent des caractères spéciaux et des règles qui permettent de rechercher, capturer ou manipuler du texte. Pas d’inquiétude, je vais tout vous expliquer simplement !
Les regex reposent sur des symboles qui ont des significations précises. Voici les principaux que vous rencontrerez souvent :
-
Le point (
.
) Correspond à n’importe quel caractère sauf une nouvelle ligne (\n
). Exemple : -
Le symbole d’ancrage début (
^
) Vérifie si un motif est au début de la chaîne. Exemple : -
Le symbole d’ancrage fin (
$
) Vérifie si un motif est à la fin de la chaîne. Exemple : -
Les crochets (
[]
) Spécifient un ensemble de caractères possibles. Exemple : -
Le tiret dans les crochets (
[a-z]
) Définit une plage de caractères. Exemple : -
L’étoile (
*
) Correspond à zéro ou plusieurs occurrences du caractère précédent. Exemple : -
Le plus (
+
) Correspond à une ou plusieurs occurrences du caractère précédent. Exemple : -
Le point d’interrogation (
?
) Correspond à zéro ou une occurrence du caractère précédent. Exemple :
Classes de caractères et métasymboles
Les classes de caractères et les métasymboles permettent de créer des expressions régulières plus flexibles et précises. Ils définissent des ensembles de caractères ou des motifs spécifiques que vous pouvez utiliser dans vos recherches.
Les classes de caractères
Les classes de caractères permettent de définir un ensemble de caractères à
matcher. Elles sont encadrées par des crochets []
.
-
Caractères individuels Correspondent à l’un des caractères définis dans les crochets. Exemple :
-
Plages de caractères Utilisez un tiret
-
pour définir une plage. Exemple : -
Exclusion avec
^
Le^
en début de crochets exclut les caractères spécifiés. Exemple : -
Combinaison de caractères et plages Vous pouvez combiner des plages et des caractères individuels. Exemple :
Les métasymboles
Les métasymboles représentent des motifs spécifiques.
-
Le point (
.
) Correspond à n’importe quel caractère sauf une nouvelle ligne. Exemple : -
Le backslash (
\
) Utilisé pour échapper un caractère spécial ou pour indiquer une classe prédéfinie. Exemple : -
Le pipe (
|
) Correspond à une alternative (ou logique). Exemple :
Classes de caractères prédéfinies
Ces classes simplifient les recherches courantes.
-
\d
Correspond à un chiffre (0-9). Exemple : -
\D
Correspond à tout sauf un chiffre. Exemple : -
\w
Correspond à un caractère alphanumérique (a-z, A-Z, 0-9, et_
). Exemple : -
\W
Correspond à tout sauf un caractère alphanumérique. Exemple : -
\s
Correspond à un espace, une tabulation ou une nouvelle ligne. Exemple : -
\S
Correspond à tout sauf un espace. Exemple :
Les quantificateurs
Les quantificateurs sont des outils puissants des expressions régulières qui permettent de définir combien de fois un motif peut se répéter. Ils sont essentiels pour matcher des motifs variables, comme des séquences de chiffres ou des mots avec des longueurs différentes.
Les principaux quantificateurs
-
L’astérisque (
*
) Correspond à zéro ou plusieurs occurrences du caractère ou du groupe précédent. Exemple :Ici, le motif capture “l” suivi de zéro ou plusieurs “o”.
-
Le plus (
+
) Correspond à une ou plusieurs occurrences du caractère ou du groupe précédent. Exemple :Contrairement à
*
, le motif échoue si aucune occurrence n’est trouvée. -
Le point d’interrogation (
?
) Correspond à zéro ou une occurrence du caractère ou du groupe précédent. Exemple : -
Les accolades (
{n}
ou{n,m}
) Correspondent à un nombre précis ou une plage d’occurrences.{n}
: exactementn
occurrences.{n,}
: au moinsn
occurrences.{n,m}
: entren
etm
occurrences.
Exemple :
Quantificateurs “gourmands” et “non-gourmands”
Par défaut, les quantificateurs sont gourmands, c’est-à-dire qu’ils
capturent autant de caractères que possible. Pour les rendre non-gourmands,
ajoutez un point d’interrogation ?
juste après le quantificateur.
Exemple :
Combinaisons pratiques
-
Capturer une adresse IP : Une adresse IP se compose de 4 groupes de 1 à 3 chiffres séparés par des points.
-
Trouver des mots répétés :
-
Valider un numéro de téléphone :
Les fonctions du module re
Le module re
de Python propose plusieurs fonctions très pratiques pour
travailler avec les expressions régulières. Chaque fonction a un rôle précis
et vous permet de rechercher, remplacer ou diviser des chaînes de caractères
efficacement.
Fonction re.match()
La fonction re.match()
vérifie si un motif apparaît au début d’une chaîne.
Si ce n’est pas le cas, elle retourne None
.
Exemple simple :
Limitation : Si le motif n’est pas au début de la chaîne, il ne sera pas trouvé.
Fonction re.search()
Contrairement à re.match()
, la fonction re.search()
recherche le motif
n’importe où dans la chaîne.
Exemple :
Ici, le mot “Python” est trouvé même s’il n’est pas au début de la chaîne.
Fonction re.findall()
La fonction re.findall()
retourne une liste contenant toutes les
occurrences correspondant au motif.
Exemple :
Sortie :
Fonction re.finditer()
C’est une variante de re.findall()
, mais elle retourne un itérateur au
lieu d’une liste. Cet itérateur contient des objets match que vous pouvez
manipuler.
Exemple :
Fonction re.sub()
La fonction re.sub()
permet de remplacer un motif par une autre chaîne.
Exemple :
Sortie :
Fonction re.split()
La fonction re.split()
découpe une chaîne en fonction d’un motif et retourne
une liste des segments.
Exemple :
Sortie :
Fonction re.compile()
Vous pouvez “préparer” une regex pour la réutiliser plusieurs fois grâce à
re.compile()
. Cela peut aussi améliorer les performances.
Exemple :
Travailler avec des groupes et des captures
Les groupes et les captures sont l’un des aspects les plus puissants des expressions régulières en Python. Ils permettent d’extraire des sous-parties précises d’un texte, comme un e-mail dans une phrase ou une date dans un journal.
Qu’est-ce qu’un groupe ?
Un groupe est une partie de l’expression régulière entourée de parenthèses ()
.
Ces parenthèses permettent de capturer et de manipuler des sous-chaînes
correspondant au motif.
Exemple simple :
Sortie :
Numérotation des groupes
Les groupes capturés sont numérotés automatiquement de gauche à droite, à partir de 1 (le groupe 0 correspond au motif complet).
Exemple avec plusieurs groupes :
Nommage des groupes
Pour rendre votre regex plus lisible, vous pouvez nommer vos groupes avec
(?P<nom>)
. Vous accéderez ensuite aux groupes avec leurs noms.
Exemple :
Récupérer tous les groupes
Vous pouvez récupérer tous les groupes d’un match sous forme de tuple avec
groups()
.
Exemple :
Groupes non capturants
Parfois, vous voulez grouper sans capturer, par exemple pour appliquer un
quantificateur à un groupe sans l’enregistrer. Utilisez alors (?:...)
.
Exemple :
Captures imbriquées
Vous pouvez imbriquer des groupes pour capturer des sous-parties plus précises.
Exemple :
Groupes alternatifs
Vous pouvez utiliser |
pour spécifier des alternatives au sein d’un groupe.
Exemple :
Utilisation pratique
-
Extraire un e-mail :
-
Extraire une URL :
Expressions régulières avancées
Maintenant que vous maîtrisez les bases des expressions régulières, il est temps de découvrir des fonctionnalités avancées qui rendent les regex encore plus puissantes. Dans ce chapitre, nous allons explorer les assertions, les lookarounds, et les regex optimisées.
Assertions : les ancres de position
Les assertions permettent de fixer des conditions sur la position d’un motif sans le capturer.
-
Mot entier (
\b
) Correspond à une limite de mot (début ou fin). Exemple : -
Non-mot entier (
\B
) Correspond à tout sauf une limite de mot. Exemple :
Lookahead et Lookbehind : les lookarounds
Les lookarounds permettent de vérifier des motifs avant ou après une position sans les capturer.
-
Lookahead positif (
(?=...)
) Vérifie qu’un motif suit la position actuelle. Exemple : -
Lookahead négatif (
(?!...)
) Vérifie qu’un motif ne suit pas la position actuelle. Exemple : -
Lookbehind positif (
(?<=...)
) Vérifie qu’un motif précède la position actuelle. Exemple : -
Lookbehind négatif (
(?<!...)
) Vérifie qu’un motif ne précède pas la position actuelle. Exemple :
Modifier le comportement des regex
-
Mode multi-lignes (
re.MULTILINE
) Le caractère^
correspond au début de chaque ligne, et$
à la fin de chaque ligne. Exemple : -
Mode point étendu (
re.DOTALL
) Le point (.
) correspond également aux sauts de ligne (\n
). Exemple : -
Mode insensible à la casse (
re.IGNORECASE
) Les correspondances ignorent les majuscules et les minuscules. Exemple :
Bonnes pratiques
Les expressions régulières sont puissantes, mais elles peuvent vite devenir un casse-tête si on les utilise mal. Dans ce chapitre, je vais partager avec vous quelques bonnes pratiques pour écrire des regex efficaces, ainsi que les erreurs courantes à éviter.
-
Privilégiez la simplicité Évitez les regex trop complexes. Une regex simple est plus facile à lire, à maintenir et à déboguer. Exemple :
Mauvais :
Mieux :
-
Ajoutez des commentaires Si votre regex devient trop complexe, utilisez le mode verbose (
re.VERBOSE
) pour ajouter des commentaires. Exemple : -
Évitez les regex inutiles Parfois, une fonction Python standard est suffisante. Exemple :
Mauvais :
Mieux :
-
Utilisez des outils pour tester vos regex Des plateformes comme Regex101 ↗ vous aident à visualiser et tester vos regex.
-
Échappez les caractères spéciaux Si vous recherchez des caractères spéciaux (comme
.
ou*
), échappez-les avec\
. Exemple :
Astuces pour le débogage
-
Utilisez
re.DEBUG
pour afficher des informations sur la regex. Exemple : -
Découpez les regex complexes en sous-parties et testez-les indépendamment.
-
Visualisez les captures avec
resultat.groups()
ouresultat.groupdict()
pour comprendre ce qui est extrait.
Conclusion
Les expressions régulières sont un outil incroyablement puissant pour manipuler et analyser du texte en Python. Que ce soit pour valider des données, rechercher des motifs ou nettoyer des chaînes, elles vous permettent de gagner du temps et d’automatiser des tâches complexes.
Dans ce guide, nous avons exploré les bases, les fonctions du module re
, et
des techniques avancées comme les lookarounds et les quantificateurs
non-gourmands. Avec ces connaissances, vous êtes désormais prêt à résoudre des
problèmes réels et à intégrer les regex dans vos projets.
À mon avis, le plus important est de pratiquer et de garder vos regex simples et lisibles. Et n’oubliez pas : des outils comme Regex101 ↗ sont vos meilleurs amis pour tester et affiner vos expressions.
Maintenant, à vous de jouer ! 😊