Les expressions régulières en Python se composent d'éléments de correspondance unitaire et de quantificateurs.
Symboles spéciaux et classes de caractères
Ces deux concepts appartiennent aux éléments de correspondance unitaire. Chaque symbole spécial ou classe ne correspond qu'à un seul caractère de la chaîne cible.
Tableau des métacaractères :
| Métacaractère | Description |
|---|---|
| . | Correspond à n'importe quel caractère sauf le saut de ligne |
| \w | Correspond à une lettre, chiffre ou underscore |
| \s | Correspond à un espace blanc |
| \d | Correspond à un chiffre |
| \n | Correspond à un saut de ligne |
| \t | Correspond à une tabulation |
| \b | Correspond à une fin de mot |
| ^ | Début de chaîne |
| $ | Fin de chaîne |
| \W | Correspond à tout caractère non alphanumérique ou underscore |
| \D | Correspond à tout caractère non numérique |
| \S | Correspond à tout caractère non espace blanc |
| a|b | Correspond à a ou b (relation OU) |
| ( ) | Délimite un groupe de capture |
| [...] | Correspond à un caractère dans la classe spécifiée |
| [^...] | Correspond à un caractère hors de la classe spécifiée |
Classes de caractères []
| Expression | Signification |
|---|---|
| [0123456789] | Correspond à n'importe quel chiffre |
| [0-9] | Correspond à n'importe quel chiffre (syntaxe abrégée) |
| [a-z] | Correspond à une lettre minuscule |
| [A-Z] | Correspond à une lettre majuscule |
| [0-9a-zA-Z] | Correspond à un chiffre ou une lettre |
Quantificateurs
Les quantificateurs s'appliquant aux éléments de correspondance unitaire et indiquent le nombre de répétitions :
| Quantificateur | Description |
|---|---|
| {n} | Correspond exactement à n occurrences |
| {m,n} | Correspond entre m et n occurrences |
| {n,} | Correspond à au moins n occurrences |
| * | Équivalent à {0,}, aucune occurrence ou plusieurs (maximal) |
| ? | Équivalent à {0,1}, zéro ou une occurrence (déactive la correspondance maximale) |
| + | Équivalent à {1,}, au moins une occurrence (maximal) |
La correspondance maximale est le comportement par défaut, appelée correspondance gloutonne.
Pour illustrer la différence entre .* (glouton) et .*? (non glouton) :
import re
phrase = "Le langage Python est populaire"
pattern_glouton = r'(.*)on(.*?) .*'
pattern_non_glouton = r'(.*?)on(.*?) .*'
match_glouton = re.search(pattern_glouton, phrase)
match_non_glouton = re.search(pattern_non_glouton, phrase)
print(match_glouton.group(1)) # Le langage Pyth
print(match_non_glouton.group(1)) # Le langage Pyth
Avec une chaîne contenant plusieurs occurrences de "on" :
phrase = "Python et le crocheton sont intéressants"
m_g = re.search(pattern_glouton, phrase)
m_ng = re.search(pattern_non_glouton, phrase)
print(m_g.group(1)) # Python et le crochet
print(m_ng.group(1)) # Pyth
# .* glouton consomme jusqu'au dernier "on", .*? s'arrête au premier
Échappement
La combinaison antislash-lettre a parfois une signification spéciale :
\n correspond à un saut de ligne
\\n correspond au texte littéral \n
Le module re
Le module re permet de manipuler les expressions régulières en Python.
Méthodes principales
| Méthode | Fonction |
|---|---|
findall(pattern, string) |
Retourne toutes les correspondances sous forme de liste |
finditer(pattern, string) |
Retourne un itérateur d'objets correspondance |
search(pattern, string) |
Retourne la première correspondance |
match(pattern, string) |
Correspond au début de la chaîne seulement |
compile(pattern) |
Crée un objet pattern réutilisable |
sub(pattern, repl, string) |
Remplace les correspondances |
Exemples d'utilisation
# Recherche de toutes les voyelles
result = re.findall('[aeiouy]', 'Bonjour le monde')
print(result) # ['o', 'o', 'u', 'e', 'e', 'o', 'e']
# Recherche itérative
matches = re.finditer('\\d+', 'Le numéro 123 et le code 456')
for item in matches:
print(item.group()) # 123 puis 456
# Première correspondance
premier = re.search('la', 'La vie est belle')
print(premier.group()) # La
# Correspondance au début
debut = re.match('Ceci', 'Ceci est un test')
print(debut.group()) # Ceci
Compilation de motifs
motif = re.compile(r'\d{2}:\d{2}')
horaire = motif.findall('Réunion à 14:30, pause à 15:15')
print(horaire) # ['14:30', '15:15']
Découpage et remplacement
termes = re.split('[,;]', 'pomme,banane;cerise,datte')
print(termes) # ['pomme', 'banane', 'cerise', 'datte']
texte = re.sub('\\d', '#', 'Code: ABC123')
print(texte) # Code: ABC###
Groupes de capture
# Capture de groupes
donnees = re.findall(r'(\\w+)@(\\w+\\.\\w+)', 'contact@example.com')
print(donnees) # [('contact', 'example.com')]
# Groupes nommés
info = re.search(r'(?P<nom>\\w+)\\s(?P<prenom>\\w+)', 'Marie Curie')
print(info.group('nom')) # Marie
print(info.group('prenom')) # Curie
Modules tiers
Pour installer des modules tiers, utiliser pip install nom_du_module dans le terminal.
Le module requests
import requests
reponse = requests.get('https://www.example.com')
contenu_texte = reponse.text
contenu_binaire = reponse.content
Le module openpyxl
from openpyxl import Workbook
classeur = Workbook()
feuille = classeur.active
feuille.title = 'Données'
feuille['A1'] = 'ID'
feuille['B1'] = 'Nom'
feuille.append([1, 'Alice'])
feuille.append([2, 'Bob'])
classeur.save('utilisateurs.xlsx')
Le module hashlib
import hashlib
texte = 'Données à chiffrer'
hasher = hashlib.sha256()
hasher.update(texte.encode('utf-8'))
empreinte = hasher.hexdigest()
# Avec salage
sel = 'mon_sel_securise'
hasher.update(sel.encode('utf-8'))
empreinte_salee = hasher.hexdigest()
Le module subprocess
import subprocess
resultat = subprocess.run(['echo', 'Bonjour'],
capture_output=True,
text=True)
print(resultat.stdout) # Bonjour
# Exécution avec shell
proc = subprocess.Popen('dir',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
sortie, erreurs = proc.communicate()
print(sortie.decode('cp850'))
Le module logging
import logging
import logging.config
LOGGING_CONFIG = {
'version': 1,
'formatters': {
'standard': {
'format': '[%(asctime)s] %(levelname)s - %(message)s'
},
},
'handlers': {
'file': {
'class': 'logging.FileHandler',
'filename': 'app.log',
'formatter': 'standard',
'level': 'INFO'
},
'console': {
'class': 'logging.StreamHandler',
'formatter': 'standard',
'level': 'DEBUG'
}
},
'root': {
'handlers': ['file', 'console'],
'level': 'DEBUG'
}
}
logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger('mon_module')
logger.info('Application démarrée')
logger.error('Erreur de connexion', exc_info=True)