Comprendre le comportement du caractère « $ » dans les expressions régulières Python
- Lorsqu’on utilise le module
re de Python, on considère généralement que ^ signifie « début de chaîne » et que $ signifie « fin de chaîne ».
- Cependant,
$ ne signifie pas toujours uniquement « fin de chaîne », et son comportement peut varier selon la plateforme.
- En Python, lorsque le mode multiligne est désactivé, le caractère
$ peut correspondre à la fin de la chaîne ou juste avant le caractère de saut de ligne final.
Différence entre la fin de chaîne et la correspondance avec un saut de ligne
- Quand le mode multiligne est désactivé, en Python, il ne faut pas utiliser uniquement
$ si l’on veut faire correspondre strictement la fin de la chaîne sans caractère de saut de ligne.
- On peut utiliser
\z et \Z pour faire correspondre la fin de la chaîne.
- En Python, avec
re.MULTILINE, $ correspond à la fin de la chaîne ainsi qu’à la fin de chaque ligne (juste avant le saut de ligne).
Comparaison du comportement des expressions régulières sur différentes plateformes
- Un tableau comparant la correspondance de motifs sur
cat\n selon plusieurs plateformes montre que, si l’on autorise une correspondance incluant le saut de ligne, l’utilisation de $ en mode multiligne se comporte de manière cohérente.
- Si l’on veut une correspondance sans inclure le saut de ligne, il faut utiliser
\z sur toutes les plateformes sauf Python et ECMAScript, où il faut respectivement utiliser \Z ou $ sans mode multiligne.
L’avis de GN⁺
- Cet article peut alerter les développeurs qui utilisent les expressions régulières sur le comportement inattendu du caractère
$ en Python.
- Il souligne que les expressions régulières sont très puissantes pour le traitement de chaînes, mais qu’il faut rester prudent car leur comportement peut varier d’une plateforme à l’autre.
- Les développeurs doivent connaître ces différences et effectuer des tests supplémentaires pour éviter les problèmes de compatibilité lors du développement d’applications multiplateformes.
- Parmi les autres bibliothèques d’expressions régulières offrant des fonctionnalités similaires, on trouve
java.util.regex de Java et System.Text.RegularExpressions de .NET ; là aussi, il faut comprendre les différences de comportement propres à chaque plateforme.
- Lorsqu’on introduit une nouvelle syntaxe ou un nouveau comportement d’expression régulière, il faut prendre en compte la compatibilité avec le code existant, l’impact sur les performances et la courbe d’apprentissage au sein de l’équipe, puis évaluer soigneusement les bénéfices et les coûts de ces changements.
1 commentaires
Commentaires Hacker News
grep,sed,awk, Python, etc.) le traitent par défaut comme une fin de ligne.