Aller au contenu principal

Expressions régulières

#Expressions régulières

Les expressions régulières (regex) sont des suites de caractères qui forment un motif de recherche. Elles sont utilisées pour rechercher, extraire ou remplacer des portions de texte dans des chaînes.

#Syntaxe de base

  • Littéraux : a, b, 1, @ correspondent à eux-mêmes.
  • Classes de caractères :
    • [abc] : un des caractères a, b, ou c.
    • [a-z] : une lettre minuscule.
    • [0-9] ou \d : un chiffre.
    • [^\d] ou \D : tout sauf un chiffre.
  • Quantificateurs :
    • * : 0 ou plus.
    • + : 1 ou plus.
    • ? : 0 ou 1.
    • {n} : exactement n fois.
    • {n,} : n fois ou plus.
    • {n,m} : entre n et m fois.

#Groupes et capture

Les parenthèses () définissent des groupes et capturent le texte correspondant.

#Exemple (Python)

pythonpython
1import re2 3# Groupes capturants4text = "John Doe, 25 ans"5match = re.search(r"(\w+) (\w+), (\d+) ans", text)6if match:7    print("Prénom:", match.group(1))8    print("Nom:", match.group(2))9    print("Âge:", match.group(3))

#Remplacements

Les expressions régulières permettent de remplacer des parties de texte.

#Exemple (Python)

pythonpython
1import re2 3# Remplacement4text = "Il y a 3 pommes et 5 oranges."5new_text = re.sub(r"\d+", "X", text)6print(new_text)  # Il y a X pommes et X oranges.7 8# Remplacement avec groupes9text = "Date: 2023-10-05"10new_text = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\3/\2/\1", text)11print(new_text)  # Date: 05/10/2023

#Parsing de logs HTTP

Les expressions régulières sont souvent utilisées pour parser des logs.

#Exemple (Python)

pythonpython
1import re2 3log = '127.0.0.1 - - [20/Oct/2023:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 2326'4pattern = r'(\d+\.\d+\.\d+\.\d+) - - \[([^\]]+)\] "(\w+) ([^ ]+) HTTP/(\d\.\d)" (\d+) (\d+)'5 6match = re.match(pattern, log)7if match:8    ip, date, method, path, version, status, size = match.groups()9    print(f"IP: {ip}")10    print(f"Date: {date}")11    print(f"Method: {method}")12    print(f"Path: {path}")13    print(f"Version: {version}")14    print(f"Status: {status}")

#Rétro-références

Une rétro-référence permet de faire référence à un groupe capturant dans la même expression.

#Exemple (Python)

pythonpython
1import re2 3# Trouver des mots répétés4text = "C'est un un test."5match = re.search(r"\b(\w+)\s+\1\b", text)6if match:7    print("Mot répété trouvé:", match.group(1))  # un

#Exercice : Validation d'adresses email

Implémentez une expression régulière pour valider des adresses email simples. L'adresse doit contenir un @ et un . dans le domaine.

#Instructions

  1. L'adresse email doit commencer par des caractères alphanumériques ou des underscores.
  2. Elle doit contenir un @.
  3. Le domaine doit contenir des caractères alphanumériques, des points ou des tirets.
  4. Elle doit se terminer par un point suivi de 2 à 4 caractères alphabétiques.

#Exemple de code

pythonpython
1import re2 3def validate_email(email):4    pattern = r'^[a-zA-Z0-9_]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}5    return re.match(pattern, email) is not None6 7# Exemples8emails = ["test@example.com", "invalid.email", "user@domain.co.uk"]9for email in emails:10    print(f"{email}: {validate_email(email)}")

#Moteurs pratiques vs théorie

Dans la pratique, les moteurs de regex incluent des extensions (ex: lookaheads, lookbehinds) non présentes dans la théorie des langages.

Complexité
  • La correspondance regex peut être coûteuse (jusqu'à O(2^n) dans le pire cas avec certaines extensions).
  • Pour de meilleures performances, privilégier les expressions simples et les bibliothèques optimisées.