logo oujood
🔍

Les expressions régulières en Python (RegEx)

Une expression régulière (RegEx) est un modèle de recherche textuel. Le module re de Python permet de rechercher, extraire, diviser et remplacer des portions de chaînes selon ces modèles.

OUJOOD.COM

Importer le module re

Le module re fait partie de la bibliothèque standard Python. On l'importe avant toute utilisation. Voici un premier exemple qui cherche le mot "expressions" dans une chaîne et récupère sa position.

  📋 Copier le code

import re
match = re.search(r"expressions", "Avec oujood, apprendre les expressions régulières de Python")
print(match)
# <re.Match object; span=(27, 38), match='expressions'>
print(match.group())          # expressions
print("Index de départ :", match.start())  # 27
print("Index de fin :", match.end())       # 38

Le préfixe r devant la chaîne (r"expressions") signifie chaîne brute : le caractère \ n'est pas interprété comme un caractère d'échappement Python, ce qui évite des conflits avec la syntaxe des RegEx.

Les métacaractères

Les métacaractères sont des caractères spéciaux qui ont une signification précise dans un motif RegEx. En voici les principaux :

MétacaractèreDescriptionExemple
\Supprime la signification spéciale du caractère suivant\d
[]Représente un ensemble de caractères[a-m]
^Correspond au début de la chaîne^bon
$Correspond à la fin de la chaîneplanet$
.Correspond à n'importe quel caractère sauf le saut de lignebo..j
|OU logique entre deux motifsfalls|stays
?Zéro ou une occurrencehe.?o
{}Nombre exact d'occurrenceshe.{2}o
*Zéro ou plusieurs occurrenceshe.*o
+Une ou plusieurs occurrenceshe.+o
()Groupe de motifs(abc)+

Les séquences spéciales

Les séquences spéciales commencent par \ et désignent des catégories de caractères ou des positions dans la chaîne.

SéquenceDescriptionExemple
\ADébut de la chaîne\AThe
\bDébut ou fin d'un motr"\bain"
\BPas en début ni en fin de motr"\Bain"
\dChiffre (0 à 9)\d
\DTout caractère non numérique\D
\sEspace blanc (espace, tabulation, saut de ligne)\s
\STout caractère non espace\S
\wLettre, chiffre ou underscore\w
\WTout caractère non alphanumérique\W
\ZFin de la chaîneSpain\Z

Le préfixe r devant une chaîne RegEx garantit que les séquences \ sont transmises telles quelles au moteur d'expressions régulières.

Les ensembles de caractères

Un ensemble se définit avec des crochets [] et correspond à l'un des caractères qu'il contient.

EnsembleDescription
[arn]Correspond à a, r ou n
[a-n]Tout caractère minuscule entre a et n
[^arn]Tout caractère sauf a, r et n
[0-9]Tout chiffre entre 0 et 9
[0-5][0-9]Tout nombre à deux chiffres entre 00 et 59
[a-zA-Z]Toute lettre minuscule ou majuscule
[+]Le caractère + littéral (les métacaractères perdent leur sens dans un ensemble)

re.findall() : toutes les correspondances

findall() retourne une liste de toutes les correspondances non chevauchantes. Si aucune correspondance n'est trouvée, la liste est vide.

  📋 Copier le code

import re
texte = "Mon adresse est numéro 6 rue 16 bloc 25, et celle de mon ami est 98 rue 25 bloc 56"
# \d+ correspond à une séquence de chiffres
match = re.findall(r"\d+", texte)
print(match)
# ['6', '16', '25', '98', '25', '56']

re.search() : première correspondance

search() parcourt la chaîne et retourne un objet Match pour la première correspondance trouvée. Si aucune correspondance n'existe, elle retourne None. L'objet Match expose des méthodes pour récupérer la position et la valeur.

  📋 Copier le code

import re
# Cherche un jour (00-39) suivi d'un nom de mois
regex = r" ([0-3][0-9]) ([a-zA-Z]+)"
texte = "Ma date de naissance est le 22 Aout"
resultat = re.search(regex, texte)
if resultat and int(resultat.group(1)) <= 31:
    print("Trouvé à l'index %s-%s" % (resultat.start(), resultat.end()))
    print("Résultat complet :", resultat.group(0))
    print("Jour :", resultat.group(1))   # 22
    print("Mois :", resultat.group(2))   # Aout
else:
    print("Aucun résultat trouvé.")

re.split() : diviser selon un motif

split() découpe une chaîne partout où le motif correspond et retourne une liste. Le paramètre maxsplit limite le nombre de découpages. Le paramètre flags=re.IGNORECASE rend la recherche insensible à la casse.

  📋 Copier le code

from re import split
texte1 = "Words, words , Words"
texte2 = "Word's words Words"
# \W+ : découpe sur tout caractère non alphanumérique
print(split(r'\W+', texte1))  # ['Words', 'words', 'Words']
print(split(r'\W+', texte2))  # ['Word', 's', 'words', 'Words']
texte3 = "Le 12 janvier 2016, à 11:02 AM"
print(split(r'\W+', texte3))  # ['Le', '12', 'janvier', '2016', 'à', '11', '02', 'AM']
print(split(r'\d+', texte3))  # ['Le ', ' janvier ', ', à ', ':', ' AM']

  📋 Copier le code

import re
texte1 = "Le 12 Janvier 2016, à 11:02 AM"
texte2 = "He, Un Garçon et un garçon, venez ici"
# maxsplit=1 : un seul découpage
print(re.split(r'\d+', texte1, 1))
# ['Le ', ' Janvier 2016, à 11:02 AM']
# flags=re.IGNORECASE : insensible à la casse
print(re.split(r'[e-g]+', texte2, flags=re.IGNORECASE))
print(re.split(r'[e-g]+', texte2))

re.sub() : remplacer des correspondances

sub(pattern, remplacement, texte) remplace toutes les occurrences du motif par la chaîne de remplacement. Un quatrième paramètre count limite le nombre de remplacements.

  📋 Copier le code

import re
texte = 'abc de 12 fg \n 34  h57 68 kil'
# Remplacer tous les espaces blancs par un underscore
new_texte = re.sub(r'\s+', '_', texte)
print(new_texte)  # abc_de_12_fg_34_h57_68_kil
# Avec count=2 : seulement les 2 premières occurrences
new_texte2 = re.sub(r'\s+', '_', texte, 2)
print(new_texte2)

L'objet Match

Les fonctions search() et match() retournent un objet Match quand une correspondance est trouvée. Cet objet expose plusieurs attributs et méthodes utiles.

  📋 Copier le code

import re
texte = "Bienvenue sur le site oujood.com"
resultat = re.search("site", texte)
print(resultat.re)      # re.compile('site') — l'expression utilisée
print(resultat.string)  # la chaîne dans laquelle on a cherché
print(resultat.start()) # index de début de la correspondance
print(resultat.end())   # index de fin
print(resultat.span())  # tuple (début, fin)

  📋 Copier le code

import re
s = "J'apprends Python avec le site oujood.com"
# \D{6} : 6 caractères non numériques, suivis d'un espace et d'un "a"
resultat = re.search(r"\D{6} a", s)
print(resultat.group())  # Python a

Par carabde | Mis à jour le 24 avril 2026