Expressions régulières Python (module re) — Guide pratique
Expressions régulières Python (module re) — Guide pratique
Découvrez comment exploiter la puissance des expressions régulières en Python avec le module re. Exemples pas à pas illustrant motifs courants, techniques de correspondance et fonctions avancées.
Qu'est-ce qu'une expression régulière ?
Une expression régulière (RegEx) est une séquence de caractères qui définit un motif de recherche. Par exemple, le motif ^a...s$ correspond à toute chaîne de cinq lettres qui commence par a et se termine par s.
^a...s$
Les motifs peuvent être utilisés pour correspondre à des chaînes. Le tableau suivant montre comment le motif se comporte avec différentes entrées :
| Expression | Chaîne | Correspondance ? |
|---|---|---|
^a...s$ | abs | Pas de correspondance |
alias | Correspondance | |
abyss | Correspondance | |
Alias | Pas de correspondance | |
Un abaque | Pas de correspondance |
Le module re de Python fournit les outils nécessaires pour travailler avec les RegEx. Voici un exemple rapide qui utilise re.match() pour vérifier un motif contre une chaîne :
import re
motif = '^a...s$'
chaine_test = 'abyss'
resultat = re.match(motif, chaine_test)
if resultat:
print("Recherche réussie.")
else:
print("Recherche infructueuse.")
Quand le motif est trouvé, re.match() retourne un objet de correspondance ; sinon, il retourne None.
Spécifier des motifs avec des métacaractères
Les métacaractères sont des symboles spéciaux que le moteur regex interprète de manière unique. Voici une référence rapide pour les métacaractères les plus courants :
[] . ^ $ * + ? {} () \ |
Crochets : []
Les crochets définissent un ensemble de caractères à correspondre. Par exemple, [abc] correspond à toute occurrence unique de a, b ou c.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
[abc] | a | 1 correspondance |
ac | 2 correspondances | |
Hey Jude | Pas de correspondance | |
abc de ca | 5 correspondances |
Les plages peuvent être exprimées avec un tiret, ex. : [a-e] équivaut à [abcde]. Pour inverser un ensemble, placez un accent circonflexe ^ après le crochet ouvrant, ex. : [^abc] correspond à tout caractère sauf a, b ou c.
Point : .
Le point correspond à tout caractère unique sauf une nouvelle ligne.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
.. | a | Pas de correspondance |
ac | 1 correspondance | |
acd | 1 correspondance | |
acde | 2 correspondances (contient 4 caractères) |
Accent circonflexe : ^ et Dollar : $
L'accent circonflexe affirme le début d'une chaîne ; le signe dollar affirme la fin. Par exemple, ^a correspond à toute chaîne commençant par a, tandis que a$ correspond à toute chaîne se terminant par a.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
^a | a | 1 correspondance |
abc | 1 correspondance | |
bac | Pas de correspondance | |
^ab | abc | 1 correspondance |
acb | Pas de correspondance (commence par a mais pas suivi de b) |
| Expression | Chaîne | Correspondance ? |
|---|---|---|
a$ | a | 1 correspondance |
formule | 1 correspondance | |
cab | Pas de correspondance |
Quantificateurs : *, +, ?, {n,m}
Ces symboles contrôlent combien de fois l'élément précédent doit apparaître.
*— zéro ou plusieurs fois.+— une ou plusieurs fois.?— zéro ou une fois.{n,m}— au moins n et au plus m fois.
Exemples :
| Expression | Chaîne | Correspondance ? |
|---|---|---|
ma*n | mn | 1 correspondance |
man | 1 correspondance | |
maaan | 1 correspondance | |
main | Pas de correspondance (a n'est pas suivi de n) | |
femme | 1 correspondance |
| Expression | Chaîne | Correspondance ? |
|---|---|---|
ma+n | mn | Pas de correspondance (pas de a) |
man | 1 correspondance | |
maaan | 1 correspondance | |
main | Pas de correspondance (a n'est pas suivi de n) | |
femme | 1 correspondance |
| Expression | Chaîne | Correspondance ? |
|---|---|---|
ma?n | mn | 1 correspondance |
man | 1 correspondance | |
maaan | Pas de correspondance (plus d'un a) | |
main | Pas de correspondance (a n'est pas suivi de n) | |
femme | 1 correspondance |
| Expression | Chaîne | Correspondance ? |
|---|---|---|
a{2,3} | abc dat | Pas de correspondance |
abc daat | 1 correspondance (à daat) | |
aabc daaat | 2 correspondances (à aabc et daaat) | |
aabc daaaat | 2 correspondances (à aabc et daaaat) |
Motif couramment utilisé : [0-9]{2,4} correspond à deux à quatre chiffres consécutifs.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1 correspondance (à ab123csde) |
12 et 345673 | 3 correspondances (12, 3456, 73) | |
1 et 2 | Pas de correspondance |
Alternation : |
La barre verticale implémente le OU logique. Par exemple, a|b correspond à toute chaîne contenant a ou b.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
a|b | cde | Pas de correspondance |
ade | 1 correspondance (à ade) | |
acdbea | 3 correspondances (à acdbea) |
Groupement : ()
Les parenthèses groupent des sous-motifs et capturent les sous-chaînes correspondantes. Exemple : (a|b|c)xz correspond à toute chaîne qui contient a, b ou c suivi de xz.
| Expression | Chaîne | Correspondance ? |
|---|---|---|
(a|b|c)xz | ab xz | Pas de correspondance |
abxz | 1 correspondance (à abxz) | |
axz cabxz | 2 correspondances (à axzbc cabxz) |
Échappement : \
Utilisez une barre oblique inverse pour traiter un métacaractère comme littéral. Par exemple, \$a correspond à la séquence littérale $a au lieu d'interpréter $ comme l'ancre de fin de chaîne.
Séquences spéciales
Les séquences spéciales simplifient les motifs courants. Voici une liste de référence avec exemples illustratifs.
Début de chaîne : \A
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\Athe | the sun | Correspondance |
In the sun | Pas de correspondance |
Frontière de mot : \b
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\bfoo | football | Correspondance |
a football | Correspondance | |
afootball | Pas de correspondance | |
foo\b | the foo | Correspondance |
the afoo test | Correspondance | |
the afootest | Pas de correspondance |
Non-frontière de mot : \B
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\Bfoo | football | Pas de correspondance |
a football | Pas de correspondance | |
afootball | Correspondance | |
foo\B | the foo | Pas de correspondance |
the afoo test | Pas de correspondance | |
the afootest | Correspondance |
Chiffre : \d / Non-chiffre : \D
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\d | 12abc3 | 3 correspondances (à 12abc3) |
Python | Pas de correspondance | |
\D | 1ab34"50 | 3 correspondances (à 1ab34"50) |
1345 | Pas de correspondance |
Espace blanc : \s / Non-espace blanc : \S
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\s | Python RegEx | 1 correspondance |
PythonRegEx | Pas de correspondance | |
\S | a b | 2 correspondances (à a b) |
| Pas de correspondance |
Caractère de mot : \w / Non-mot : \W
| Expression | Chaîne | Correspondance ? |
|---|---|---|
\w | 12&": ;c | 3 correspondances (à 12": ;c) |
"%> ! | Pas de correspondance | |
\W | 1a2%c | 1 correspondance (à 1a2%c) |
Python | Pas de correspondance |
Fin de chaîne : \Z
| Expression | Chaîne | Correspondance ? |
|---|---|---|
Python\Z | I like Python | 1 correspondance |
I like Python Programming | Pas de correspondance | |
Python is fun. | Pas de correspondance |
Astuce : Utilisez un testeur regex en ligne comme regex101 pour créer et déboguer des motifs rapidement.
Utiliser RegEx en Python
Le module re de Python offre un ensemble riche de fonctions et constantes pour les opérations regex. Importez-le avec :
import re
Voici les utilitaires les plus courants et comment les utiliser.
re.findall()
Retourne une liste de toutes les correspondances non chevauchantes dans une chaîne.
# Extraire tous les nombres d'une chaîne
import re
chaine = 'bonjour 12 salut 89. Comment 34'
motif = '\d+'
resultat = re.findall(motif, chaine)
print(resultat) # Sortie : ['12', '89', '34']
Quand aucune correspondance n'est trouvée, une liste vide est retournée.
re.split()
Divise une chaîne à chaque point où le motif correspond, retournant une liste de sous-chaînes.
import re
chaine = 'Douze:12 Quatre-vingt-neuf:89.'
motif = '\d+'
resultat = re.split(motif, chaine)
print(resultat) # Sortie : ['Douze:', ' Quatre-vingt-neuf:', '.']
Utilisez l'argument optionnel maxsplit pour limiter le nombre de divisions. Une valeur de 0 (défaut) divise à chaque correspondance.
import re
chaine = 'Douze:12 Quatre-vingt-neuf:89 Neuf:9.'
motif = '\d+'
# Diviser seulement à la première occurrence
resultat = re.split(motif, chaine, 1)
print(resultat) # Sortie : ['Douze:', ' Quatre-vingt-neuf:89 Neuf:9.']
re.sub()
Remplace toutes les occurrences d'un motif par une chaîne de remplacement.
# Supprimer tous les caractères d'espace blanc
import re
chaine = 'abc 12\nde 23 \n f45 6'
motif = '\s+'
remplacement = ''
nouvelle_chaine = re.sub(motif, remplacement, chaine)
print(nouvelle_chaine) # Sortie : abc12de23f456
Pour limiter les remplacements, fournissez un argument count. Une valeur de 0 remplace chaque correspondance.
nouvelle_chaine = re.sub(r'\s+', remplacement, chaine, 1)
print(nouvelle_chaine) # Sortie : abc12de 23 f45 6
re.subn()
Comme re.sub(), mais retourne un tuple contenant la nouvelle chaîne et le nombre de substitutions effectuées.
nouvelle_chaine = re.subn(motif, remplacement, chaine)
print(nouvelle_chaine) # Sortie : ('abc12de23f456', 4)
re.search()
Trouve le premier emplacement où le motif correspond.
chaine = "Python est amusant"
correspondance = re.search('\\APython', chaine)
if correspondance:
print("motif trouvé dans la chaîne")
else:
print("motif non trouvé")
# Sortie : motif trouvé dans la chaîne
Objet de correspondance (Match Object)
Quand une correspondance est trouvée, re.search() retourne un objet Match. Méthodes et attributs courants incluent :
group()— la sous-chaîne correspondante.start()/end()— indices de la correspondance.span()— un tuple de (start, end).groups()— tous les groupes capturés.
chaine = '39801 356, 2102 1111'
motif = '(\d{3}) (\d{2})'
correspondance = re.search(motif, chaine)
if correspondance:
print(correspondance.group())
print(correspondance.group(1))
print(correspondance.group(2))
print(correspondance.groups())
print(correspondance.start(), correspondance.end(), correspondance.span())
else:
print("motif non trouvé")
# Sortie :
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Utiliser des chaînes brutes (préfixe r)
Préfixer un littéral de chaîne avec r traite les barres obliques inverses comme caractères littéraux, prévenant les séquences d'échappement accidentelles. C'est particulièrement utile dans les motifs regex.
chaine = '\n et \r sont des séquences d\'échappement.'
resultat = re.findall(r'[\n\r]', chaine)
print(resultat) # Sortie : ['\n', '\r']
Pour une exploration plus approfondie du module re, référez-vous à la documentation officielle Python.
Python
- Mots-clés et identifiants Python : Maîtriser les mots réservés et les conventions de nommage
- Maîtriser les types de données Python : Guide pratique
- Maîtriser les opérateurs Python : Guide complet
- Maîtriser les arguments de fonctions Python : Positionnels, nommés et paramètres par défaut
- Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
- Maîtriser les itérateurs Python : fonctionnement et création des vôtres
- Les fermetures Python expliquées : comment les fonctions imbriquées capturent les variables
- Maîtriser Python datetime : guide pratique pour les dates, heures et fuseaux horaires
- Maîtriser le module time de Python : Fonctions, structures et exemples pratiques