Modules Python : expressions régulières et utilitaires intégrés

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)

Étiquettes: Python regex re openpyxl requests

Publié le 18 juillet à 01h57