web-dev-qa-db-fra.com

Y a-t-il une différence entre les préfixes de chaîne r et R en Python?

Le code Visual Studio met en évidence les littéraux de chaîne avec les préfixes r et R différemment:

Match = re.search(r"\d{2} \d{4} \d{2}:\d{2}:\d{2})", Output) 
Match = re.search(R"\d{2} \d(4} \d{2}:\d{2}:\d{2})", Output) 

enter image description here

Y a-t-il une différence de sens entre ces deux notations? Des conventions différentes sont-elles utilisées pour r et R?

24
bers

Il n'y a pas de différence de sens entre ces notations. Référence :

Les littéraux de chaîne et d'octets peuvent éventuellement être préfixés par une lettre "r" ou "R"; ces chaînes sont appelées chaînes brutes et traitent les barres obliques inverses comme des caractères littéraux

Maintenant, concernant le comportement de VSCode:

  • la première coloration (avec le jaune {2}) se produit lorsque l'éditeur suppose que vous écrivez une expression régulière,
  • le second (avec le bleu {2}) se produit lorsque l'éditeur pense que vous écrivez une chaîne de format, quelque chose comme "{0}, {1}!".format("Hello", "world").

Cela devient plus évident lorsque nous ajoutons un peu plus de syntaxe:

highlighted code snippet

Maintenant, il semble que VSCode devrait traiter R"literal" De la même façon que r"literal", Mais à la place, il le colore de la même façon que "literal", Ce qui est probablement un minuscule bogue que personne n'a repéré parce que tout le monde écrit r en minuscules.

Correction de commentaire : Ce n'est pas un bug, c'est une fonctionnalité! surligneur VSCode utilise intelligemment le fait que les préfixes r et R sont équivalents, et vous permet, au développeur, d'avoir une coloration correcte en adoptant une convention d'utilisation r pour les chaînes brutes regex et R pour les chaînes brutes non regex.

Les chaînes brutes sont souvent interprétées comme des expressions régulières. C'est un peu un problème, car en fonction de l'application, ce n'est peut-être pas le cas le plus courant. (...) MagicPython suit une convention selon laquelle un préfixe minuscule r signifie une chaîne d'expression régulière, mais un préfixe R majuscule signifie simplement une chaîne brute sans sémantique d'expression régulière spéciale.

41
Kos

En général, Python est sensible à la casse. Selon la spécification de syntaxe littéral de chaîne , cependant, les préfixes de chaîne peuvent être soit la casse (soit l'ordre). La différence est donc visuelle, bien que la tradition consiste principalement à utiliser des minuscules, et les lettres majuscules peuvent être plus difficiles à distinguer.

4
Yann Vernier