826 Stimmen

Was genau bewirken die Zeichenfolgenpräfixe "u" und "r", und was sind rohe Zeichenfolgenliterale?

Bei der Frage diese Frage wurde mir klar, dass ich nicht viel über rohe Saiten wusste. Für jemanden, der behauptet, ein Django-Trainer zu sein, ist das echt ätzend.

Ich weiß, was eine Kodierung ist, und ich weiß, was u'' allein tut, da ich bekomme, was Unicode ist.

  • Aber was bedeutet r'' genau tun? Welche Art von Zeichenfolge ergibt sich daraus?

  • Und vor allem: Was zum Teufel bedeutet ur'' tun?

  • Schließlich gibt es eine zuverlässige Möglichkeit, von einer Unicode-Zeichenfolge zu einer einfachen Rohzeichenfolge zurückzukehren?

  • Ach, und übrigens, wenn Ihr System und Ihr Texteditor auf UTF-8 eingestellt sind, hat u'' tatsächlich etwas tun?

839voto

Alex Martelli Punkte 805329

Es gibt nicht wirklich ein "rohes String "; es gibt rohe String-Literale die genau die String-Literale sind, die durch ein 'r' vor dem einleitenden Zitat.

Ein "rohes Stringliteral" ist eine etwas andere Syntax für ein Stringliteral, in der ein Backslash, \ bedeutet "nur ein Backslash" (es sei denn, er steht direkt vor einem Anführungszeichen, das ansonsten das Literal abschließen würde) - keine "Escape-Sequenzen" zur Darstellung von Zeilenumbrüchen, Tabulatoren, Leerzeichen, Form-Feeds usw. In normalen String-Literalen muss jeder Backslash verdoppelt werden, damit er nicht als Beginn einer Escape-Sequenz interpretiert wird.

Diese Syntaxvariante gibt es vor allem deshalb, weil die Syntax regulärer Ausdrücke viele Backslashes enthält (aber nie am Ende, so dass die obige "except"-Klausel keine Rolle spielt) und es etwas besser aussieht, wenn man die Verdopplung der einzelnen Backslashes vermeidet - das ist alles. Es hat auch einige Popularität erlangt, um native Windows-Dateipfade auszudrücken (mit Backslashes anstelle von regulären Schrägstrichen wie auf anderen Plattformen), aber das ist sehr selten nötig (da normale Schrägstriche meist auch unter Windows funktionieren) und unvollkommen (wegen der obigen "except"-Klausel).

r'...' ist eine Byte-Zeichenkette (in Python 2.*), ur'...' ist eine Unicode-Zeichenkette (wiederum in Python 2.*), und jede der anderen drei Arten der Quotierung erzeugt auch genau die gleichen Arten von Zeichenketten (so zum Beispiel r'...' , r'''...''' , r"..." , r"""...""" sind alle Byte-Strings usw.).

Nicht sicher, was Sie mit "gehen" meinen zurück " - es gibt keine Vorwärts- und Rückwärtsrichtung, weil es keine rohe Zeichenkette gibt Typ Es ist nur eine alternative Syntax, um ganz normale String-Objekte auszudrücken, egal ob Byte oder Unicode.

Und ja, in Python 2.*, u'...' ist natürlich immer anders als nur '...' -- Ersteres ist eine Unicode-Zeichenkette, letzteres eine Byte-Zeichenkette. In welcher Kodierung das Literal ausgedrückt werden kann, ist eine völlig andere Frage.

Betrachten Sie z. B. (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

Das Unicode-Objekt benötigt natürlich mehr Speicherplatz (bei einer sehr kurzen Zeichenkette ist der Unterschied natürlich sehr gering ;-).

216voto

Mark Byers Punkte 761508

Es gibt zwei Arten von Strings in Python: die traditionelle str Typ und den neueren unicode Typ. Wenn Sie ein String-Literal ohne das u vorne bekommt man die alte str Typ, der 8-Bit-Zeichen speichert, und mit dem u vorne erhalten Sie den neueren unicode Typ, der jedes Unicode-Zeichen speichern kann.

Die r ändert den Typ überhaupt nicht, sondern nur die Art und Weise, wie das Zeichenfolgenliteral interpretiert wird. Ohne den r werden Backslashes als Escape-Zeichen behandelt. Mit dem r werden Backslashes als Literal behandelt. Der Typ ist in jedem Fall derselbe.

ur ist natürlich eine Unicode-Zeichenkette, bei der Backslashes buchstäbliche Backslashes sind und nicht Teil von Escape-Codes.

Sie können versuchen, eine Unicode-Zeichenkette in eine alte Zeichenkette zu konvertieren, indem Sie die str() Funktion, aber wenn es Unicode-Zeichen gibt, die in der alten Zeichenkette nicht dargestellt werden können, erhalten Sie eine Ausnahme. Sie könnten sie zunächst durch Fragezeichen ersetzen, aber das würde natürlich dazu führen, dass diese Zeichen nicht mehr lesbar sind. Es wird nicht empfohlen, die str Typ, wenn Sie Unicode-Zeichen korrekt behandeln wollen.

74voto

xiaolong Punkte 3026

'roher String' bedeutet, dass es so gespeichert wird, wie es erscheint. Zum Beispiel, '\' ist nur eine Backslash anstelle eines Flucht .

41voto

off99555 Punkte 3261

Lassen Sie es mich einfach erklären: In Python 2 können Sie Strings in 2 verschiedenen Typen speichern.

Die erste ist ASCII das ist str Typ in Python verwendet er 1 Byte Speicher. (256 Zeichen, speichert hauptsächlich englische Alphabete und einfache Symbole)

Der 2. Typ ist UNICODE das ist Unicode Typ in Python. Unicode speichert alle Arten von Sprachen.

Standardmäßig bevorzugt Python str Typ, aber wenn Sie eine Zeichenkette in Unicode Typ können Sie u vor dem Text wie u'text' oder Sie können dies tun, indem Sie unicode('text')

Also u ist nur ein kurzer Weg, um eine Funktion aufzurufen, die die str zu Unicode . Das war's!

Jetzt ist die r Teil, den Sie vor den Text setzen, um dem Computer mitzuteilen, dass es sich bei dem Text um Rohtext handelt und der Backslash kein Fluchtzeichen ist. r' \n ' wird kein neues Zeilenzeichen erzeugt. Es ist nur einfacher Text mit 2 Zeichen.

Wenn Sie konvertieren möchten str zu Unicode und dort auch Rohtext einfügen, verwenden Sie ur denn ru wird einen Fehler auslösen.

JETZT, der wichtige Teil:

Sie können einen Backslash nicht speichern, indem Sie r Das ist die einzige Ausnahme. Daher wird dieser Code einen Fehler erzeugen: r'\'

Um einen Backslash (nur einen) zu speichern, müssen Sie ' \\ '

Wenn Sie mehr als 1 Zeichen speichern wollen, können Sie immer noch r wie r' \\ ' wird wie erwartet 2 Backslashes erzeugen.

Ich kenne den Grund dafür nicht. r funktioniert nicht mit einem Backslash-Speicher, aber der Grund dafür wurde noch von niemandem beschrieben. Ich hoffe, dass es ein Fehler ist.

39voto

Ein "u"-Präfix bedeutet, dass der Wert den Typ unicode statt str .

Raw-String-Literale mit einem "r"-Präfix entkommen allen Escape-Sequenzen in ihnen, also len(r"\n") ist 2. Da sie Escape-Sequenzen entkommen, können Sie ein String-Literal nicht mit einem einzelnen Backslash beenden: Das ist keine gültige Escape-Sequenz (z. B. r"\" ).

"Raw" ist nicht Teil des Typs, es ist lediglich eine Möglichkeit, den Wert darzustellen. Zum Beispiel, "\\n" und r"\n" sind identische Werte, genau wie 32 , 0x20 und 0b100000 sind identisch.

Sie können Unicode-Rohstringliterale haben:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

Die Kodierung der Quelldatei bestimmt nur, wie die Quelldatei zu interpretieren ist, sie hat keinen Einfluss auf andere Ausdrücke oder Typen. Allerdings ist es empfohlen um Code zu vermeiden, bei dem eine andere Kodierung als ASCII die Bedeutung verändern würde:

Dateien, die ASCII (oder UTF-8, für Python 3.0) verwenden, sollten keinen Kodierungs-Cookie haben. Latin-1 (oder UTF-8) sollte nur verwendet werden, wenn ein Kommentar oder Docstring einen Autorennamen erwähnen muss, der Latin-1 erfordert; andernfalls ist die Verwendung von \x , \u または \U Escapes ist der bevorzugte Weg, um Nicht-ASCII-Daten in String-Literale einzuschließen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X