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 :
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
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Renvoie un objet Match s'il est trouvé, None sinon. Modèle idiomatique :
if m := re.search(r"\d+", testo):
print(m.group())re.match : uniquement au début de la chaîne
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
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 :
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub : substitution
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) :
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Groupes nommés
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
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 toore.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
É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`.
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
É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`.
Afficher l'indice
re.sub(r"\d+-\d+", "XXX", s)
Solution disponible après 3 tentatives
Défi supplémentaire
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.
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