it-swarm.com.de

Was genau machen "u" und "r" Zeichenkettenflags und was sind rohe Zeichenkettenliterale?

Als ich diese Frage fragte, wurde mir klar, dass ich nicht viel über rohe Saiten wusste. Für jemanden, der behauptet, ein Django Trainer zu sein, ist das scheiße.

Ich weiß, was eine Codierung ist, und ich weiß, was u'' alleine macht, da ich bekomme, was Unicode ist.

  • Aber was macht r'' genau? Was für eine Saite ergibt das?

  • Und vor allem, was zum Teufel macht ur''?

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

  • Ah, und übrigens, wenn Ihr System und Ihr Texteditor-Zeichensatz auf UTF-8 eingestellt sind, macht u'' tatsächlich etwas?

577
e-satis

Es gibt nicht wirklich einen "rohen String "; Es gibt rohe Zeichenfolgenliterale , die genau die Zeichenfolgenliterale sind, die mit einem 'r' vor dem Eröffnungszitat markiert sind.

Ein "unformatiertes Zeichenfolgenliteral" ist eine etwas andere Syntax für ein Zeichenfolgenliteral, bei dem ein umgekehrter Schrägstrich (\) als "nur ein umgekehrter Schrägstrich" interpretiert wird (außer wenn er direkt vor einem Anführungszeichen steht, das sonst das Zeichen beenden würde) wörtlich) - Keine "Escape-Sequenzen" zur Darstellung von Zeilenumbrüchen, Tabulatoren, Backspaces, Form-Feeds usw. In normalen String-Literalen muss jeder Backslash verdoppelt werden, um zu vermeiden, dass er als Beginn einer Escape-Sequenz verwendet wird.

Diese Syntaxvariante existiert hauptsächlich, weil die Syntax von Mustern für reguläre Ausdrücke stark von Backslashes geprägt ist (aber niemals am Ende, sodass die oben stehende "except" -Klausel keine Rolle spielt). - das ist alles. Es hat auch an Popularität gewonnen, native Windows-Dateipfade auszudrücken (mit Backslashes anstelle von regulären Schrägstrichen wie auf anderen Plattformen), aber das wird sehr selten benötigt (da normale Schrägstriche meistens auch unter Windows funktionieren) und unvollkommen (aufgrund der "except" -Klausel) über).

r'...' ist eine Byte-Zeichenfolge (in Python 2. *), ur'...' ist eine Unicode-Zeichenfolge (wiederum in Python 2. *) und any von den anderen drei Arten des Zitierens erzeugt auch genau die gleichen Arten von Zeichenfolgen (so sind beispielsweise r'...', r'''...''', r"...", r"""...""" alle Byte-Zeichenfolgen usw.) ).

Nicht sicher, was Sie mit "zurückgehen " meinen - es gibt keine eigentlichen Vorwärts- und Rückwärtsrichtungen, da es keine rohe Zeichenfolge gibt Typ =, es ist nur eine alternative Syntax, um vollkommen normale String-Objekte, Bytes oder Unicodes auszudrücken.

Und ja, in Python 2. *, u'...'ist natürlich immer anders als nur '...' - ersteres ist eine Unicode-Zeichenfolge, letzteres ist eine Bytefolge. In welcher Codierung das Literal ausgedrückt werden könnte, ist eine völlig orthogonale Frage.

Betrachten Sie beispielsweise (Python 2.6):

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

Das Unicode-Objekt benötigt natürlich mehr Speicherplatz (sehr kleiner Unterschied für eine sehr kurze Zeichenfolge, offensichtlich ;-).

625
Alex Martelli

In Python gibt es zwei Arten von Zeichenfolgen: den traditionellen Typ str und den neueren Typ unicode. Wenn Sie ein String-Literal ohne u eingeben, erhalten Sie den alten str -Typ, der 8-Bit-Zeichen speichert, und mit dem u erhalten Sie den neueren unicode Typ, der ein beliebiges Unicode-Zeichen speichern kann.

Das r ändert den Typ überhaupt nicht, es ändert nur, wie das String-Literal interpretiert wird. Ohne das r werden Backslashes als Escape-Zeichen behandelt. Mit dem r werden Backslashes als Literal behandelt. In jedem Fall ist der Typ derselbe.

ur ist natürlich eine Unicode-Zeichenfolge, bei der Backslashes wörtliche Backslashes sind, die nicht Teil von Escape-Codes sind.

Sie können versuchen, eine Unicode-Zeichenfolge mit der Funktion str() in eine alte Zeichenfolge zu konvertieren. Wenn jedoch Unicode-Zeichen vorhanden sind, die in der alten Zeichenfolge nicht dargestellt werden können, tritt eine Ausnahme auf. Wenn Sie möchten, können Sie diese zuerst durch Fragezeichen ersetzen, dies würde jedoch dazu führen, dass diese Zeichen nicht mehr lesbar sind. Es wird nicht empfohlen, den Typ str zu verwenden, wenn Sie Unicode-Zeichen korrekt verarbeiten möchten.

162
Mark Byers

'raw string' bedeutet, dass es so gespeichert wird, wie es erscheint. Zum Beispiel ist '\' nur ein Backslash anstelle eines Escaping.

53
xiaolong

Ein "u" -Präfix kennzeichnet den Wert vom Typ unicode anstelle von str.

Rohe String-Literale mit einem "r" -Präfix maskieren alle darin enthaltenen Escape-Sequenzen, also ist len(r"\n") 2. Da es sich um Escape-Sequenzen handelt, können Sie ein String-Literal nicht mit einem einzelnen Backslash beenden. Dies ist keine gültige Escape-Sequenz (zB r"\").

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

Sie können rohe Unicode-String-Literale haben:

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

Die Codierung der Quelldatei bestimmt lediglich, wie die Quelldatei interpretiert werden soll. Ausdrücke oder Typen werden dadurch nicht beeinflusst. Es ist jedoch empfohlen , um Code zu vermeiden, bei dem eine andere Codierung als ASCII die Bedeutung ändern würde:

Dateien, die ASCII (oder UTF-8 für Python 3.0) verwenden, sollten kein Coding-Cookie haben. Latin-1 (oder UTF-8) sollte nur verwendet werden, wenn in einem Kommentar oder einer Dokumentationszeichenfolge ein Autorenname angegeben werden muss, für den Latin-1 erforderlich ist. Andernfalls ist die Verwendung von\x,\u oder\U Escape die bevorzugte Methode, um Nicht-ASCII-Daten in Zeichenfolgenliterale aufzunehmen.

33
Roger Pate

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

Das erste ist ASCII, was str ist, tippe Python ein, es verwendet 1 Byte Speicher. (256 Zeichen, speichert hauptsächlich englische Alphabete und einfache Symbole)

Der zweite Typ ist UNICODE, was nicode ist. Geben Sie Python ein, es werden 2 Byte Speicher benötigt. (65536 Zeichen, dies schließt also alle Zeichen aller Sprachen auf der Erde ein)

Standardmäßig wird python str eingeben bevorzugen, aber wenn Sie einen String in nicode eingeben möchten, können Sie eingeben vor dem Text wie 'text ' oder Sie können dies tun, indem Sie nicode (' text ') aufrufen

ist also nur eine kurze Möglichkeit, eine Funktion aufzurufen, um str nach nicode umzuwandeln. Das ist es!

Nun setzen Sie den Teil r vor den Text, um dem Computer mitzuteilen, dass es sich bei dem Text um unformatierten Text handelt. Der Backslash sollte kein Escapezeichen sein. r '\ n' erstellt kein neues Zeilenzeichen. Es ist nur einfacher Text mit 2 Zeichen.

Wenn Sie str in nicode konvertieren und dort auch rohen Text einfügen möchten, verwenden Sie r, da r ausgelöst wird ein Fehler.

JETZT der wichtige Teil:

Sie können einen Backslash nicht mit r speichern, es ist die einzige Ausnahme. Dieser Code erzeugt also einen Fehler: r '\'

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

Wenn Sie mehr als 1 Zeichen speichern möchten, können Sie r wie r '\\' verwenden, um erwartungsgemäß 2 Backslashes zu erzeugen.

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

27
off99555

Vielleicht ist das offensichtlich, vielleicht auch nicht, aber Sie können den String '\' erstellen, indem Sie x = chr (92) aufrufen

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False
4
Bomba Ps

Unicode-String-Literale

Unicode-String-Literale (String-Literale mit dem Präfix u) sind nicht mehr verwendet in Python 3. Sie sind weiterhin gültig, aber nur aus Kompatibilitätsgründen = mit Python 2.

Rohe String-Literale

Wenn Sie ein Zeichenfolgenliteral erstellen möchten, das nur aus leicht zu tippenden Zeichen wie englischen Buchstaben oder Zahlen besteht, können Sie diese einfach eingeben: 'hello world'. Wenn Sie jedoch auch exotischere Zeichen einfügen möchten, müssen Sie eine Problemumgehung verwenden. Eine der Problemumgehungen ist Escape-Sequenzen . Auf diese Weise können Sie beispielsweise eine neue Zeile in Ihrer Zeichenfolge darstellen, indem Sie Ihrem Zeichenfolgenliteral zwei einfach zu tippende Zeichen \n hinzufügen. Wenn Sie also die Zeichenfolge 'hello\nworld' drucken, werden die Wörter in separaten Zeilen gedruckt. Das ist sehr praktisch!

Andererseits gibt es Situationen, in denen Sie ein Zeichenfolgenliteral erstellen möchten, das Escape-Sequenzen enthält, aber nicht möchten, dass diese von Python interpretiert werden. Sie möchten, dass sie roh sind . Schau 'dir diese Beispiele an:

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

In solchen Situationen können Sie dem String-Literal einfach das Zeichen r voranstellen: r'hello\nworld', und Python interpretiert keine Escape-Sequenzen. Die Zeichenfolge wird genau so gedruckt, wie Sie sie erstellt haben.

Rohe String-Literale sind nicht vollständig "roh"?

Viele Leute erwarten, dass die rohen String-Literale in einem Sinne roh sind, dass "alles, was zwischen den Anführungszeichen steht, von Python ignoriert wird" . Das ist nicht wahr. Python erkennt immer noch alle Escape-Sequenzen, interpretiert sie nur nicht, sondern lässt sie unverändert. Dies bedeutet, dass unformatierte String-Literale weiterhin gültige String-Literale sein müssen .

Aus der lexikalischen Definition eines String-Literal:

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

Es ist klar, dass String-Literale (roh oder nicht), die ein einfaches Anführungszeichen enthalten: 'hello'world' oder mit einem Backslash enden: 'hello world\', nicht gültig sind.

1
Jeyekomon