Frage

Technisch jede ungerade Anzahl von umgekehrten Schrägstrichen, wie es in die docs .

>>> 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, wie der Parser konnte nur Schrägstriche in rohen Strings behandeln als normale Zeichen (ist nicht das, was rohe Strings sind alle über?), Aber ich bin fehlt wahrscheinlich etwas offensichtlich. TIA!

War es hilfreich?

Lösung

Der Grund, in der ein Teil dieser Abschnitt erklärt die ich fett markiert:

  

String Anführungszeichen können mit einem entwertet werden   Backslash, , aber die umgekehrten Schrägstrich bleibt   in der Zeichenkette; zum Beispiel ist ein r"\""   gültige Stringliteral bestehend aus zwei   Zeichen: ein Backslash und ein Doppel   Zitat; r"\" ist keine gültige Zeichenfolge   wörtliche (auch eine rohe String kann nicht beenden   in einer ungeraden Anzahl von umgekehrten Schrägstrichen).   Insbesondere kann ein Roh-String nicht beenden   in einem einzigen Schrägstrich (da die   Backslash würde die Flucht der folgenden   Anführungszeichen). Beachten Sie auch, dass ein   Einzel Backslash durch eine neue Zeile gefolgt   als diese beiden Zeichen interpretiert   als Teil der Zeichenfolge, nicht als eine Linie   Fortsetzung.

So rohe Strings sind nicht zu 100% roh, gibt es noch einige rudimentäre Backslash-Verarbeitung ist.

Andere Tipps

Die ganze Missverständnis über Pythons rohe Strings ist, dass die meisten Leute denken, dass Backslash (innerhalb eines rohen string) wie alle anderen nur ein ganz normaler Charakter. Es ist nicht. Der Schlüssel zu verstehen, ist dieses Tutorial Sequenz des Python:

  

Wenn ein ' r ' oder ' R ' Präfix vorhanden ist, ein Zeichen mit einem folgenden   Backslash wird in der Zeichenfolge ohne Änderung enthalten, und alle   Schrägstriche werden in der Zeichenfolge links

So ein beliebiges Zeichen nach einem umgekehrten Schrägstrich ist Teil von Roh-String. Sobald Parser eine rohe Zeichenfolge (nicht Unicode-one) eintreten und treffen auf einen umgekehrten Schrägstrich es weiß, gibt es zwei Zeichen (ein Backslash und ein Zeichen folgenden it).

Auf diese Weise:

  

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

     

r'abc \ 'd' umfasst a, b, c, \,‘, d

     

r'abc \ '' umfasst a, b, c, \, ‚

und

  

r'abc \ ' umfasst a, b, c, \' , aber es gibt jetzt kein abschließendes Zitat.

Letzter Fall zeigt, dass nach der Dokumentation nun ein Parser nicht schließen Zitat als letzt qoute finden Sie oben sehen, sind Teil der Zeichenfolge dh. Backslash kann hier nicht zuletzt, da es String schließen char ‚verschlingen‘ wird.

Das ist so, wie es ist! Ich sehe es als eines dieser kleinen Mängel in Python!

Das glaube ich nicht, dass es ein guter Grund dafür, aber es ist definitiv nicht das Parsen; es ist wirklich einfach rohe Strings mit \ als letztes Zeichen zu analysieren.

Der Haken ist, wenn Sie erlauben, \ das letzte Zeichen in einem rohen String zu sein, dann werden Sie nicht in der Lage sein zu setzen „in einem rohen String. Es scheint so dass Python ging“ anstatt daß \ als das letzte Zeichen .

Allerdings sollte dies keine Probleme verursachen.

Wenn Sie sind besorgt über nicht in der Lage, einfach Windows-Ordner pathes wie c:\mypath\ schreiben dann dir keine Sorgen, denn Sie sie als r"C:\mypath" darstellen können, und wenn Sie ein Unterverzeichnis Namen anhängen müssen, tun Sie es nicht mit String-Verkettung, denn es ist nicht der richtige Weg ist, es trotzdem zu tun! Verwendung os.path.join

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

Ein weiterer Trick ist chr zu verwenden (92), wie es in "\" bewertet.

Ich hatte vor kurzem eine Reihe von Schrägstrichen zu reinigen und folgende hat den Trick:

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

Ich weiß, dass dies nicht kümmert sie von dem „Warum“, aber der Faden zieht viele Menschen nach einer Lösung für ein unmittelbares Problem suchen.

Damit Sie eine rohe Zeichenkette mit einem Schrägstrich enden Ich schlage vor, Sie diesen Trick verwenden können:

>>> print r"c:\test"'\\'
test\

Da \“in dem rohen String erlaubt ist. Dann kann es nicht verwendet werden, um das Ende des Stringliteral zu identifizieren.

Warum stoppen nicht die Zeichenfolge Parsen wörtliche, wenn Sie das erste „begegnen?

Wenn das der Fall war, dann \“würde wörtliche innerhalb der Zeichenfolge nicht erlaubt sein. Aber es ist.

Der Grund, warum r'\' ist syntaktisch nicht korrekt ist, dass, obwohl der String-Ausdruck roh ist die verwendeten Anführungszeichen (einfach oder doppelt) zu entkommen werden immer da sie das Ende des Zitats sonst bedeuten würden. Also, wenn Sie einen Apostroph innerhalb eines einzigen String in Anführungszeichen zum Ausdruck bringen, gibt es keine andere Möglichkeit, als \' verwenden. Gleiches gilt für die doppelten Anführungszeichen.

Aber Sie könnten verwendet werden:

'\\'

Ein anderer Benutzer, die ihre Antwort da gelöscht (nicht sicher, ob sie gutgeschrieben werden mögen) vorgeschlagen, dass die Sprache Python Designer in der Lage sein können, das Parser-Design unter Verwendung der gleichen Parsing-Regeln und die Erweiterung Escape-Zeichen zu Rohform zu vereinfachen wie ein nachträglicher Einfall (wenn die wörtliche als roh markiert).

Ich dachte, es war eine interessante Idee und bin auch als Community Wiki für die Nachwelt.

von C Comming es mir ziemlich klar, dass eine einzelne \ Werke als Escape-Zeichen in dem Sie Sonderzeichen setzen, wie Zeilenumbrüche, Tabulatoren und Anführungszeichen in Strings.

, die in der Tat ist nicht zulassen \ als letztes Zeichen, da es die entkommen "und die Parser Choke machen. Aber wie bereits erwähnt \ legal ist.

  

Trotz seiner Rolle, auch eine rohe String kann nicht in einem einzigen Ende   Backslash, da der Backslash das folgende Zitat   Zeichen Sie müssen noch die umgebenden Anführungszeichen entkommen   band sich in der Zeichenkette. Das heißt, r „... \“ ist keine gültige Zeichenfolge   wörtliches-a raw String kann nicht in einer ungeraden Anzahl von Schrägstrichen beenden.
  Wenn Sie eine rohe String mit einem einzigen Schrägstrich enden müssen, können Sie verwenden,   und zwei Stück aus dem zweiten.

einige Tipps:

1), wenn Sie Backslash für Pfad zu manipulieren, müssen dann Standard-Python-Modul os.path ist dein Freund. zum Beispiel:

  

os.path.normpath ( 'c: / folder1 /')

2), wenn Sie Strings mit Backslash bauen wollen in ihm aber ohne Backslash am Ende der Zeichenfolge dann raw String ist dein Freund (use ‚r‘ Präfix vor Ihrer Zeichenkette). zum Beispiel:

r'\one \two \three'

3), wenn Sie einen String in einer Variablen X mit einem umgekehrten Schrägstrich voranstellen müssen, dann können Sie dies tun:

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4), wenn Sie einen String mit einem umgekehrten Schrägstrich am Ende erstellen müssen dann kombinieren Spitze 2 und 3:

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

Jetzt lilypond_statement enthält "\DisplayLilyMusic \upper"

long live Python! :)

n3on

Ich habe dieses Problem und fand eine Teillösung, die in einigen Fällen gut. Trotz Python keinen String mit einem einzigen Schrägstrich in der Lage zu beenden, kann es serialisiert und in eine Textdatei mit einem einzigen Schrägstrich am Ende gespeichert werden. Deshalb, wenn, was Sie brauchen, ist auf Ihrem Computer einen Text mit einem einzigen Schrägstrich zu speichern, ist es möglich:

x = 'a string\\' 
x
'a string\\' 

# Now save it in a text file and it will appear with a single backslash:

with open("my_file.txt", 'w') as h:
    h.write(x)

BTW ist es nicht mit json arbeiten, wenn Sie es Dump mit json Bibliothek Python.

Schließlich arbeite ich mit Spyder, und ich bemerkte, dass, wenn ich die Variable in Spinnentexteditor mit einem Doppelklick auf seinem Namen in dem Variablen-Explorer öffnen, es mit einem einzigen Schrägstrich dargestellt und kann auf diese Weise in die Zwischenablage kopiert werden (es ist nicht sehr hilfreich für die meisten Bedürfnisse, aber vielleicht für einige ..).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top