Passer au contenu principal
eLearner.app
Module 8 · Leçon 4 sur 432/36 dans le cours~12 min
Leçons du module (4/4)

Module re : regex en Python

Le module re expose les expressions régulières en Python. Si vous avez déjà suivi le cours Regex sur ce site, vous trouverez toute la syntaxe familière ; nous examinons ici les API.

Raw string: r"..."

Les expressions régulières utilisent de nombreux antislashs (\d, \b, \s). Écrivez-les toujours sous forme de raw strings pour ne pas avoir à les doubler :

Python
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"

re.search : trouver la première occurrence

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Renvoie un objet Match s'il est trouvé, None sinon. Modèle idiomatique :

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match : uniquement au début de la chaîne

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (doesn't start with a digit)

Pour chercher n'importe où, préférez re.search.

re.findall : toutes les occurrences

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

Si le modèle contient des groupes de capture, findall renvoie les groupes, et non la correspondance complète :

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub : substitution

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

Il fonctionne également avec une fonction de remplacement (qui reçoit le Match) :

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Groupes nommés

Python
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno")    # '2025'
m.groupdict()      # {'anno': '2025', 'mese': '01', 'giorno': '15'}

Flags utiles

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL)            # . matches newline too

re.finditer pour la sécurité de la mémoire

Si vous devez traiter des correspondances dans un bloc de texte énorme, re.findall alloue une liste en mémoire contenant toutes les chaînes de correspondances extraites. Il est préférable d'utiliser re.finditer(), qui renvoie un itérateur paresseux d'objets Match, consommant un minimum de mémoire.

À vous de jouer

Exercice#python.m8.l4.e1
Tentatives : 0Chargement…

Étant donné `text = 'ordine #123, totale €45.50, ricevuta #456'`, extrayez TOUS les numéros de commande (les chiffres après #) dans `orders` sous forme de liste de chaînes. Évaluez `orders`.

Chargement de l'éditeur…
Afficher l'indice

re.findall(r"#(\d+)", text) — groupe de capture pour les chiffres uniquement.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m8.l4.e2
Tentatives : 0Chargement…

Étant donné `s = 'tel: 06-12345678 e tel: 02-9876'`, remplacez tous les numéros de téléphone (format \d+-\d+) par la chaîne 'XXX' et assignez-les à `masked`. Évaluez `masked`.

Chargement de l'éditeur…
Afficher l'indice

re.sub(r"\d+-\d+", "XXX", s)

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m8.l4.e3
Tentatives : 0Chargement…

Importez le module `re`. Extrayez tous les nombres composés d'un ou plusieurs chiffres de la chaîne `log_line = "Error 404 in 15ms"`. Stockez la liste dans `numbers` et évaluez-la.

Chargement de l'éditeur…
Afficher l'indice

Utilisez re.findall(r'\d+', log_line) pour extraire tous les nombres sous forme de liste de chaînes.

Solution disponible après 3 tentatives