Technisch gesehen eine beliebige Anzahl von Backslashes, wie in der Dokumentation beschrieben .
>>> 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
Es scheint, als könnte der Parser Backslashes in rohen Zeichenfolgen einfach als reguläre Zeichen behandeln (geht es nicht um rohe Zeichenfolgen?), Aber mir fehlt wahrscheinlich etwas Offensichtliches.
Antworten:
Der Grund wird in dem Teil dieses Abschnitts erläutert, den ich fett hervorgehoben habe:
Roh-Strings sind also nicht zu 100% roh, es gibt immer noch eine rudimentäre Backslash-Verarbeitung.
quelle
r"foo\bar\baz" "\\"
(Bei Mehrdeutigkeit in Parens einschließen) erstellt beim Kompilieren ein einzelnes Literal, dessen erster Teil roh und nur das letzte winzige Bit nicht roh ist, um den nachfolgenden Backslash zu ermöglichen.Das ganze Missverständnis über Pythons rohe Saiten ist, dass die meisten Leute denken, dass Backslash (innerhalb einer rohen Saite) nur ein regulärer Charakter ist wie alle anderen. Es ist nicht. Der Schlüssel zum Verständnis ist die Tutorial-Sequenz dieses Pythons:
Jedes Zeichen, das einem Backslash folgt, ist Teil der Rohzeichenfolge. Sobald der Parser eine unformatierte Zeichenfolge (keine Unicode-Zeichenfolge) eingibt und auf einen Backslash stößt, weiß er, dass zwei Zeichen vorhanden sind (ein Backslash und ein Zeichen folgen darauf).
Diesen Weg:
und:
Der letzte Fall zeigt, dass ein Parser laut Dokumentation jetzt kein schließendes Zitat finden kann, da das letzte Zitat, das Sie oben sehen, Teil der Zeichenfolge ist, dh, dass der Backslash hier nicht das letzte sein kann, da er das schließende Zeichen der Zeichenfolge "verschlingt".
quelle
Das ist der Stand der Dinge! Ich sehe es als einen dieser kleinen Fehler in Python!
Ich glaube nicht, dass es einen guten Grund dafür gibt, aber es wird definitiv nicht analysiert. Es ist wirklich einfach, rohe Zeichenfolgen mit \ als letztem Zeichen zu analysieren.
Der Haken ist, wenn Sie zulassen, dass \ das letzte Zeichen in einer Rohzeichenfolge ist, können Sie "nicht in eine Rohzeichenfolge einfügen. Es scheint, dass Python mit dem Zulassen" gegangen ist, anstatt \ als letztes Zeichen zuzulassen.
Dies sollte jedoch keine Probleme verursachen.
Wenn Sie
c:\mypath\
befürchten , Windows-Ordnerpfade nicht einfach schreiben zu können, wie z. B. nicht, können Sie sie als darstellenr"C:\mypath"
, und wenn Sie einen Unterverzeichnisnamen anhängen müssen, tun Sie dies nicht mit Zeichenfolgenverkettung, z es ist sowieso nicht der richtige Weg, es zu tun! verwendenos.path.join
quelle
Damit Sie eine rohe Zeichenfolge mit einem Schrägstrich beenden können, sollten Sie diesen Trick verwenden:
quelle
Ein weiterer Trick besteht darin, chr (92) zu verwenden, da es "\" ergibt.
Ich musste kürzlich eine Reihe von Backslashes reinigen und das Folgende hat den Trick gemacht:
Mir ist klar, dass sich das nicht um das "Warum" kümmert, aber der Thread zieht viele Leute an, die nach einer Lösung für ein unmittelbares Problem suchen.
quelle
"\\"
(nicht roher String mit Backslash)Da \ "innerhalb der Rohzeichenfolge zulässig ist. Dann kann es nicht verwendet werden, um das Ende des Zeichenfolgenliteral zu identifizieren.
Warum nicht aufhören, das String-Literal zu analysieren, wenn Sie auf das erste stoßen?
Wenn dies der Fall wäre, wäre \ "im Zeichenfolgenliteral nicht zulässig. Aber es ist so.
quelle
\"
beliebigen Stelle innerhalb einer rohen Zeichenfolge mit doppelten Anführungszeichen ODER \ am Ende einer rohen Zeichenfolge mit doppelten Anführungszeichen. Die Nutzungsstatistik muss die Zwei-Zeichen-Sequenz an einer beliebigen Stelle gegenüber der Ein-Zeichen-Sequenz am Ende bevorzugen.Der Grund für die
r'\'
syntaktische Falschheit ist, dass die verwendeten Anführungszeichen (einfach oder doppelt), obwohl der Zeichenfolgenausdruck roh ist, immer maskiert werden müssen, da sie sonst das Ende des Anführungszeichens markieren würden. Wenn Sie also ein einfaches Anführungszeichen in einem einfachen Anführungszeichen ausdrücken möchten, gibt es keine andere Möglichkeit als die Verwendung\'
. Gleiches gilt für doppelte Anführungszeichen.Aber Sie könnten verwenden:
quelle
Ein anderer Benutzer, der seitdem seine Antwort gelöscht hat (nicht sicher, ob er gutgeschrieben werden möchte), schlug vor, dass die Python-Sprachdesigner das Parser-Design möglicherweise vereinfachen können, indem sie dieselben Parsing-Regeln verwenden und nachträglich maskierte Zeichen in Rohform erweitern (wenn das Literal als roh markiert wurde).
Ich fand es eine interessante Idee und füge sie als Community-Wiki für die Nachwelt hinzu.
quelle
quelle
Wenn ich von C komme, ist mir ziemlich klar, dass ein einzelnes \ als Escape-Zeichen fungiert, sodass Sie Sonderzeichen wie Zeilenumbrüche, Tabulatoren und Anführungszeichen in Zeichenfolgen einfügen können.
Das verbietet in der Tat \ als letztes Zeichen, da es dem "entgeht und den Parser ersticken lässt. Aber wie bereits erwähnt, ist \ legal.
quelle
einige Hinweise :
1) Wenn Sie den Backslash für den Pfad bearbeiten müssen, ist das Standard-Python-Modul os.path Ihr Freund. zum Beispiel :
2) Wenn Sie Zeichenfolgen mit Backslash erstellen möchten, ABER ohne Backslash am Ende Ihrer Zeichenfolge, ist die Rohzeichenfolge Ihr Freund (verwenden Sie das Präfix 'r' vor Ihrer Literalzeichenfolge). zum Beispiel :
3) Wenn Sie einer Zeichenfolge in einer Variablen X einen Backslash voranstellen müssen, können Sie Folgendes tun:
4) Wenn Sie eine Zeichenfolge mit einem Backslash am Ende erstellen müssen, kombinieren Sie Tipp 2 und 3:
jetzt enthält lilypond_statement
"\DisplayLilyMusic \upper"
Es lebe Python! :) :)
n3on
quelle
os.path.normpath
wird den Tailing Backslash entfernen ... Wie soll ich dann den Dateinamen in den Pfad einbinden ...Ich bin auf dieses Problem gestoßen und habe eine Teillösung gefunden, die in einigen Fällen gut ist. Obwohl Python einen String nicht mit einem einzigen Backslash beenden kann, kann er serialisiert und in einer Textdatei mit einem einzigen Backslash am Ende gespeichert werden. Wenn Sie also einen Text mit einem einzigen Backslash auf Ihrem Computer speichern müssen, ist Folgendes möglich:
Übrigens funktioniert es nicht mit json, wenn Sie es mit der json-Bibliothek von Python sichern.
Schließlich arbeite ich mit Spyder und habe festgestellt, dass beim Öffnen der Variablen im Texteditor von Spider durch Doppelklicken auf ihren Namen im Variablen-Explorer ein einzelner Backslash angezeigt wird und auf diese Weise in die Zwischenablage kopiert werden kann (dies ist nicht der Fall) sehr hilfreich für die meisten Bedürfnisse, aber vielleicht für einige ..).
quelle