Techniquement, tout nombre impair de barres obliques inverses, comme décrit dans la documentation .
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
File "<stdin>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
Il semble que l'analyseur pourrait simplement traiter les barres obliques inverses dans les chaînes brutes comme des caractères normaux (n'est-ce pas ce que sont les chaînes brutes?), Mais il me manque probablement quelque chose d'évident.
Réponses:
La raison est expliquée dans la partie de cette section que j'ai mise en évidence en gras:
Ainsi, les chaînes brutes ne sont pas 100% brutes, il y a encore un traitement rudimentaire de la barre oblique inverse.
la source
r"foo\bar\baz" "\\"
(wrap in parens si ambiguë) créera un seul littéral au moment de la compilation, dont la première partie est brute, et seul le dernier petit bit est non brut, pour permettre la barre oblique inverse de fin.L'idée fausse sur les chaînes brutes de python est que la plupart des gens pensent que la barre oblique inverse (dans une chaîne brute) est juste un caractère régulier comme tous les autres. Ce n'est pas. La clé à comprendre est la séquence de tutoriels de ce python:
Ainsi, tout caractère suivant une barre oblique inverse fait partie d'une chaîne brute. Une fois que l'analyseur entre une chaîne brute (non Unicode) et rencontre une barre oblique inverse, il sait qu'il y a 2 caractères (une barre oblique inverse et un caractère le suivant).
Par ici:
et:
Le dernier cas montre que selon la documentation, un analyseur ne peut pas trouver de guillemets de fermeture car le dernier guillemet que vous voyez ci-dessus fait partie de la chaîne, c'est-à-dire que la barre oblique inverse ne peut pas être la dernière ici car elle «dévorera» le caractère de fermeture de la chaîne.
la source
C'est comme ça! Je le vois comme l'un de ces petits défauts de python!
Je ne pense pas qu'il y ait une bonne raison à cela, mais ce n'est certainement pas une analyse; il est vraiment facile d'analyser les chaînes brutes avec \ comme dernier caractère.
Le hic, c'est que si vous autorisez \ à être le dernier caractère d'une chaîne brute, vous ne pourrez pas mettre "dans une chaîne brute. Il semble que python ait accepté" au lieu d'autoriser \ comme dernier caractère.
Cependant, cela ne devrait poser aucun problème.
Si vous craignez de ne pas pouvoir écrire facilement des chemins de dossier Windows tels que
c:\mypath\
alors ne vous inquiétez pas, car vous pouvez les représenter commer"C:\mypath"
, et, si vous devez ajouter un nom de sous-répertoire, ne le faites pas avec la concaténation de chaînes, car ce n'est pas la bonne façon de le faire de toute façon! utilisationos.path.join
la source
Pour que vous puissiez terminer une chaîne brute par une barre oblique, je vous suggère d'utiliser cette astuce:
la source
Une autre astuce consiste à utiliser chr (92) car il évalue à "\".
J'ai récemment dû nettoyer une chaîne de barres obliques inverses et ce qui suit a fait l'affaire:
Je me rends compte que cela ne s'occupe pas du «pourquoi» mais le fil attire de nombreuses personnes à la recherche d'une solution à un problème immédiat.
la source
"\\"
(chaîne non brute avec barre oblique inverse)Puisque \ "est autorisé dans la chaîne brute. Ensuite, il ne peut pas être utilisé pour identifier la fin du littéral de chaîne.
Pourquoi ne pas arrêter l'analyse de la chaîne littérale lorsque vous rencontrez le premier "?
Si tel était le cas, alors \ "ne serait pas autorisé dans la chaîne littérale. Mais c'est le cas.
la source
\"
n'importe où dans une chaîne brute entre guillemets, OR \ à la fin de la chaîne brute entre guillemets. Les statistiques d'utilisation doivent favoriser la séquence de deux caractères n'importe où par rapport à la séquence d'un caractère à la fin.La raison pour laquelle la
r'\'
syntaxe est incorrecte est que, bien que l'expression de chaîne soit brute, les guillemets utilisés (simples ou doubles) doivent toujours être d'échappement car ils marqueraient la fin du guillemet sinon. Donc, si vous souhaitez exprimer un guillemet simple dans une chaîne entre guillemets simples, il n'y a pas d'autre moyen que d'utiliser\'
. Il en va de même pour les guillemets doubles.Mais vous pouvez utiliser:
la source
Un autre utilisateur qui a depuis supprimé sa réponse (ne sachant pas s'il aimerait être crédité) a suggéré que les concepteurs du langage Python pourraient être en mesure de simplifier la conception de l'analyseur en utilisant les mêmes règles d'analyse et en développant les caractères échappés sous forme brute après coup. (si le littéral a été marqué comme brut).
J'ai trouvé que c'était une idée intéressante et je l'inclus en tant que wiki communautaire pour la postérité.
la source
la source
En venant de C, il me semble assez clair qu'un seul \ fonctionne comme caractère d'échappement vous permettant de mettre des caractères spéciaux tels que des retours à la ligne, des tabulations et des guillemets dans des chaînes.
Cela interdit en effet \ comme dernier caractère car il échappera au "et fera étouffer l'analyseur. Mais comme indiqué précédemment, \ est légal.
la source
quelques conseils :
1) si vous avez besoin de manipuler la barre oblique inverse pour le chemin, alors le module python standard os.path est votre ami. par exemple :
2) si vous voulez construire des chaînes avec une barre oblique inverse MAIS sans barre oblique inverse à la FIN de votre chaîne, la chaîne brute est votre ami (utilisez le préfixe «r» avant votre chaîne littérale). par exemple :
3) si vous avez besoin de préfixer une chaîne dans une variable X avec une barre oblique inverse, vous pouvez le faire:
4) si vous devez créer une chaîne avec une barre oblique inverse à la fin, combinez les astuces 2 et 3:
maintenant lilypond_statement contient
"\DisplayLilyMusic \upper"
vive le python! :)
n3on
la source
os.path.normpath
supprimera la barre oblique inverse de fin ... Alors, comment dois-je concaténer le nom de fichier dans le chemin ...J'ai rencontré ce problème et j'ai trouvé une solution partielle qui convient à certains cas. Bien que python ne puisse pas terminer une chaîne avec une seule barre oblique inverse, elle peut être sérialisée et enregistrée dans un fichier texte avec une seule barre oblique inverse à la fin. Par conséquent, si vous avez besoin d'enregistrer un texte avec une seule barre oblique inverse sur votre ordinateur, il est possible:
BTW, il ne fonctionne pas avec json si vous le videz en utilisant la bibliothèque json de python.
Enfin, je travaille avec Spyder, et j'ai remarqué que si j'ouvre la variable dans l'éditeur de texte d'araignée en double-cliquant sur son nom dans l'explorateur de variables, elle est présentée avec une seule barre oblique inverse et peut être copiée dans le presse-papiers de cette façon (ce n'est pas très utile pour la plupart des besoins mais peut-être pour certains ..).
la source