Expressions régulières en Python
Les expressions régulières décrivent des motifs textuels. Utilisez-les pour des tâches lexicales bornées, comme extraire des identifiants ou valider un petit format délibéré ; préférez un analyseur pour une structure imbriquée ou une grammaire complète.
Écrivez les motifs sous forme de chaînes brutes afin que l'échappement Python ne masque pas celui de l'expression :
import re
event = re.compile(
r"^(?P<level>INFO|WARN|ERROR)\s+user=(?P<user>[\w.-]+)$"
)
line = "INFO user=ada"
match = event.fullmatch(line)
if match:
level = match["level"]
user = match["user"]
Choisir le contrat de correspondance
searchtrouve la première correspondance n'importe où.matchne vérifie que le début.fullmatchexige que toute l'entrée corresponde et est généralement le plus clair pour valider.finditerdiffuse des objets de correspondance sans chevauchement ;findallconstruit une liste dont la forme change avec les groupes capturants.subremplace les correspondances ; un remplacement appelable permet des changements sensibles au contexte sans seconde analyse.
Utilisez des groupes nommés pour les champs métier et des groupes non capturants (?:...) lorsque le regroupement n'est que structurel.
Signification et échappement
Avec des motifs str, les classes comme \w et \d suivent Unicode par défaut. N'ajoutez re.ASCII que pour un format explicitement ASCII. La correspondance sans casse n'est pas une comparaison linguistique sensible aux paramètres régionaux.
Échappez le texte non fiable qui doit être traité littéralement :
user_supplied_prefix = "a.b"
literal_pattern = re.compile(re.escape(user_supplied_prefix))
N'interpolez pas de texte arbitraire directement dans un motif ou un modèle de remplacement. Leurs règles d'échappement diffèrent.
Performances et frontières de validation
Des répétitions imbriquées ambiguës et des alternatives qui se chevauchent peuvent provoquer un retour sur trace extrême sur une entrée hostile. Gardez les motifs simples, bornez l'entrée, testez les quasi-correspondances et isolez ou remplacez ce travail si une limite de temps stricte compte. L'API standard re ne fournit pas de délai général par correspondance.
Une expression régulière vérifie la syntaxe, pas la propriété, la délivrabilité, l'autorisation ou la validité métier. Pour URL, adresses électroniques, dates et formats structurés, préférez un analyseur standard suivi d'une validation métier.
Employez re.VERBOSE et des commentaires lorsqu'un motif exige de la maintenance. À partir d'un certain point, un analyseur nommé est l'abstraction la plus honnête.
Lire et tester le motif
Dans l'exemple, | choisit un niveau, \s+ exige au moins un caractère blanc et [\w.-]+ accepte des caractères de mot, points ou traits d'union. Les groupes nommés capturent les champs. Les ancres sont redondantes avec fullmatch.
assert event.fullmatch("INFO user=ada").groupdict() == {"level": "INFO", "user": "ada"}
assert event.fullmatch("DEBUG user=ada") is None
assert event.fullmatch("INFO user=") is None
assert event.fullmatch("INFO\nuser=ada") is not None
La dernière correspondance découle de \s, qui inclut les sauts de ligne. Pour un format sur une seule ligne autorisant uniquement espaces et tabulations entre champs, utilisez [ \t]+. Retirez délibérément le terminateur d'enregistrement avant d'analyser une ligne de fichier.
Pour insérer un remplacement littéral, utilisez re.sub(pattern, lambda match: replacement, text). La chaîne retournée est insérée sans interpréter les références de groupes ; re.escape sert aux motifs, pas aux modèles de remplacement.
Sources
Explorer les liens
Cette note n’a pas encore de liens vers d’autres notes.