222 votes

Pourquoi les littéraux de chaîne bruts de Python ne peuvent-ils pas se terminer par une simple barre oblique inversée?

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 puisse 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. TIA!

148voto

oefe Points 9122

La raison est expliquée dans la partie de l'article que j'ai souligné en gras:

Chaîne de cotes peuvent être échappé avec un la barre oblique inverse, mais la barre oblique inverse reste dans la chaîne de caractères; par exemple, r"\"" est un valide littéral de chaîne composée de deux personnages: une barre oblique et d'un double devis; r"\" n'est pas une chaîne valide littéral (même une chaîne brute ne peut pas se terminer dans un nombre impair de barres obliques inverses). Plus précisément, une chaîne brute ne peut pas se terminer dans une seule barre oblique inverse (depuis la barre oblique inverse d'échapper à la suivante citation de caractères). Notez également qu'un seul antislash suivi d'un saut de ligne est interprété comme ces deux personnages dans le cadre de la chaîne, non pas comme une ligne la poursuite.

Si cru chaînes ne sont pas 100% cru, il est encore rudimentaire barre oblique inverse-de la transformation.

146voto

Artur Points 3152

L'ensemble de malentendu à propos de python chaînes brutes, c'est que la plupart des gens pensent que la barre oblique inverse (à l'intérieur d'une chaîne brute) est juste un personnage que tous les autres. Il n'est PAS. La clé pour comprendre cette python tutoriel séquence:

Quand un 'r' ou 'R' préfixe est présent, un personnage à la suite d'une la barre oblique inverse est inclus dans la chaîne sans changement, et tous les les barres obliques inverses sont laissées dans la chaîne

Donc n'importe quel caractère à la suite d'une barre oblique inverse est la partie de la chaîne brute. Une fois analyseur entame une chaîne brute (non unicode) et de la rencontre avec une barre oblique inverse, il sait qu'il y a 2 personnages (une barre oblique et d'un char).

De cette façon:

r abc\d' comprend a, b, c, \, d

r abc\'d' comprend a, b, c, \, ', d

r abc\" comprend a, b, c, \, '

et:

r abc\' comprend a, b, c, \, ' mais il n'est pas appelé à disparaître citer maintenant.

Dernier cas montre que, selon la documentation, maintenant un analyseur ne peut pas trouver des cours de clôture le dernier qoute vous voyez ci-dessus est une partie de la chaîne ie. barre oblique inverse ne peut pas être la dernière fois qu'elle sera "dévorer" chaîne de clôture char.

28voto

hasenj Points 36139

Il en est! Je vois cela comme un de ces petits défauts en python!

Je ne pense pas qu'il y a une bonne raison pour cela, mais c'est certainement pas à l'analyse; il est vraiment facile à analyser les premières chaînes avec \ comme un dernier caractère.

Le hic, c'est que si vous vous permettez de \ à être le dernier caractère dans une chaîne brute alors vous ne serez pas en mesure de mettre " à l'intérieur d'une chaîne brute. Il semble que python est allé avec permettant " au lieu de permettre \ comme le dernier caractère.

Toutefois, cela ne devrait pas causer d'ennuis.

Si vous craignez de ne pas être en mesure de facilement écrire dossier windows chemins comme c:\mypath\ alors ne vous inquiétez pas, pour, vous pouvez les représenter comme r"C:\mypath", et, si vous avez besoin d'ajouter un nom de sous-répertoire, ne pas le faire avec la concaténation de chaîne, ce n'est pas la bonne façon de le faire de toute façon! utiliser os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'

16voto

Geekworking Points 81

Une autre astuce consiste à utiliser chr (92), car il est évalué à "\".

J'ai récemment dû nettoyer une chaîne de barres obliques inverses et voici ce qui s'est passé:

 CleanString = DirtyString.replace(chr(92),'')
 

Je me rends compte que cela ne prend pas en compte le "pourquoi" mais que le fil attire beaucoup de personnes à la recherche d'une solution à un problème immédiat.

9voto

Brian R. Bondy Points 141769

Puisque \ "est autorisé dans la chaîne brute, il ne peut pas être utilisé pour identifier la fin du littéral de chaîne.

Pourquoi ne pas arrêter d’analyser le littéral chaîne lorsque vous rencontrez le premier "?

Si c'était le cas, \ "ne serait pas autorisé à l'intérieur du littéral chaîne. Mais c'est le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X