Es gibt nicht wirklich eine "rohe Saite "; Es gibt rohe String-Literale , die genau die String-Literale sind, die 'r'
vor dem Eröffnungszitat mit einem gekennzeichnet sind .
Ein "rohes String-Literal" ist eine etwas andere Syntax für ein String-Literal, bei dem ein Backslash \
als "nur ein Backslash" verstanden wird (außer wenn es direkt vor einem Anführungszeichen steht, das das Literal sonst beenden würde) - nein "Escape-Sequenzen" zur Darstellung von Zeilenumbrüchen, Tabulatoren, Backspaces, Formular-Feeds usw. In normalen String-Literalen muss jeder Backslash verdoppelt werden, um nicht als Beginn einer Escape-Sequenz verwendet zu werden.
Diese Syntaxvariante existiert hauptsächlich, weil die Syntax von Mustern mit regulären Ausdrücken stark mit Backslashes ist (aber nie am Ende, daher spielt die obige "Ausnahme" -Klausel keine Rolle) und sie sieht ein bisschen besser aus, wenn Sie vermeiden, jedes von ihnen zu verdoppeln - - 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 auch unter Windows meistens gut funktionieren) und unvollständig (aufgrund der "Except" -Klausel über).
r'...'
ein Byte - String ist (in Python 2 *), ur'...'
auch produziert genau die gleichen Typen von Zeichenkette (so zum Beispiel ist eine Unicode - Zeichenfolge (auch hier in Python 2 *), und jede der anderen drei Arten von zitieren r'...'
, r'''...'''
, r"..."
, r"""..."""
sind alle Byte-Strings und so weiter).
Nicht sicher , was Sie unter „going back “ - es gibt keine eigen zurück und Vorwärtsrichtung, weil es keinen roher String - Typen , es ist nur eine alternative Syntax ganz normale String - Objekte, Byte oder Unicode auszudrücken , wie sie auch sein mag.
Und ja, in Python 2. * unterscheidet u'...'
sich natürlich immer von nur '...'
- ersteres ist eine Unicode-Zeichenfolge, letzteres ist eine Byte-Zeichenfolge. In welcher Codierung das Literal ausgedrückt werden könnte, ist ein völlig orthogonales Problem.
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 natürlich ;-).
u
undr
nicht kommutativ sind:ur'str'
funktioniert,ru'str'
nicht. (zumindest in ipython 2.7.2 auf win7)r
Strings getestet und festgestellt, dass wenn\
es das letzte Zeichen ist, es nicht als Literal genommen wird, sondern dem schließenden Zitat entgeht, was dazu führtSyntaxError: EOL while scanning string literal
. So\\
muss noch für die letzte Instanz verwendet werden ,\
in beliebigen Zeichenfolge mit einem Backslash.sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')
(Ubuntu 16.04 mit UTF8 lang). Ebensotype('cioa') == type(r'cioa') == type(u'cioa')
. ABER die rohe String-Interpolation macht einen Unterschied, alsosys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')
In Python gibt es zwei Arten von Zeichenfolgen: den traditionellen
str
und den neuerenunicode
Typ. Wenn Sie ein Zeichenfolgenliteral ohne dasu
vordere eingeben, erhalten Sie den altenstr
Typ, in dem 8-Bit-Zeichen gespeichert sind , und mit demu
vorderen erhalten Sie den neuerenunicode
Typ, in dem jedes Unicode-Zeichen gespeichert werden kann.Das
r
ändert den Typ überhaupt nicht, es ändert nur, wie das String-Literal interpretiert wird. Ohne dasr
werden Backslashes als Escape-Zeichen behandelt. Mit demr
werden Backslashes als wörtlich behandelt. In beiden Fällen ist der Typ derselbe.ur
ist natürlich eine Unicode-Zeichenfolge, bei der Backslashes wörtliche Backslashes sind und nicht Teil von Escape-Codes sind.Sie können versuchen, eine Unicode-Zeichenfolge mithilfe der
str()
Funktion in eine alte Zeichenfolge zu konvertieren. Wenn jedoch Unicode-Zeichen in der alten Zeichenfolge nicht dargestellt werden können, wird eine Ausnahme angezeigt. Sie können sie zuerst durch Fragezeichen ersetzen, wenn Sie dies wünschen, aber dies würde natürlich dazu führen, dass diese Zeichen nicht mehr lesbar sind. Es wird nicht empfohlen, denstr
Typ zu verwenden, wenn Sie Unicode-Zeichen korrekt verarbeiten möchten.quelle
r"\"
ein Syntaxfehler vorliegt.'raw string' bedeutet, dass es so gespeichert wird, wie es erscheint. Zum Beispiel
'\'
ist nur ein Backslash statt ein Escape .quelle
Ein "u" -Präfix gibt an, dass der Wert
unicode
eher den Typ als hatstr
.Rohe String-Literale mit dem Präfix "r" maskieren alle darin enthaltenen Escape-Sequenzen, ebenso
len(r"\n")
wie 2. Da sie Escape-Sequenzen maskieren, können Sie ein String-Literal nicht mit einem einzigen Backslash beenden: Dies ist keine gültige Escape-Sequenz (zr"\"
. B. )."Raw" ist nicht Teil des Typs, sondern nur eine Möglichkeit, den Wert darzustellen. Zum Beispiel
"\\n"
undr"\n"
sind identische Werte, so wie32
,0x20
und0b100000
identisch sind.Sie können Unicode-Raw-String-Literale verwenden:
Die Codierung der Quelldatei bestimmt nur, wie die Quelldatei interpretiert wird. Sie wirkt sich nicht auf Ausdrücke oder Typen aus. Es wird jedoch empfohlen , Code zu vermeiden, bei dem eine andere Codierung als ASCII die Bedeutung ändern würde:
quelle
Lassen Sie es mich einfach erklären: In Python 2 können Sie Zeichenfolgen in zwei verschiedenen Typen speichern.
Das erste ist ASCII, das in Python vom Typ str ist und 1 Byte Speicher verwendet. (256 Zeichen, speichert hauptsächlich englische Alphabete und einfache Symbole)
Der zweite Typ ist UNICODE , ein Unicode- Typ in Python. Unicode speichert alle Arten von Sprachen.
Standardmäßig bevorzugt Python den Typ str. Wenn Sie jedoch einen String im Unicode- Typ speichern möchten, können Sie u wie u'text ' vor den Text setzen oder dies tun, indem Sie unicode (' text ') aufrufen.
So u ist nur ein kurzer Weg , eine Funktion Guss zu nennen str zu Unicode . Das ist es!
Nun, im r- Teil, setzen Sie es vor den Text, um dem Computer mitzuteilen, dass es sich bei dem Text um Rohtext handelt. Backslash sollte kein Escapezeichen sein. r '\ n' erstellt kein neues Zeilenzeichen. Es ist nur einfacher Text mit 2 Zeichen.
Wenn Sie str in Unicode konvertieren und dort auch Rohtext einfügen möchten , verwenden Sie ur, da ru einen Fehler auslöst.
JETZT der wichtige Teil:
Sie können keinen Backslash mit r speichern , dies 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 immer noch verwenden , r wie r ‚\\‘ wird 2 Schrägstriche erzeugen , wie Sie erwartet haben .
Ich weiß nicht, warum r nicht mit einem Backslash-Speicher funktioniert, aber der Grund wird noch von niemandem beschrieben. Ich hoffe, dass es ein Fehler ist.
quelle
r'\'
illegal ist, Sie können auch keine einzige'\'
an den Schwanz einer Saite legen . Genau wier'xxxxxx\'
ist eine illegale Zeichenfolge.str
. Lesen Sie mehr zum besseren Verständnis hier: medium.com/better-programming/…Vielleicht ist das offensichtlich, vielleicht auch nicht, aber Sie können die Zeichenfolge '\' erstellen, indem Sie x = chr (92) aufrufen.
quelle
x is y
in True3 als True ausgewertet?x is y
dieTrue
aufgrund von Praktika bewertet wird . Verwendenx == y
Sie stattdessen (wenn Sie nicht prüfen, ob x und y genau dasselbe Objekt sind, das an einer einzelnen Speicherposition gespeichert ist).Unicode-String-Literale
Unicode-Zeichenfolgenliterale (Zeichenfolgenliterale mit dem Präfix
u
) werden in Python 3 nicht mehr verwendet . Sie sind weiterhin gültig, jedoch nur aus Kompatibilitätsgründen mit Python 2.Rohe String-Literale
Wenn Sie ein Zeichenfolgenliteral erstellen möchten, das nur aus leicht typisierbaren Zeichen wie englischen Buchstaben oder Zahlen besteht, können Sie diese einfach eingeben :
'hello world'
. Wenn Sie jedoch auch einige exotischere Charaktere einbeziehen möchten, müssen Sie eine Problemumgehung verwenden. Eine der Problemumgehungen sind Escape-Sequenzen . Auf diese Weise können Sie beispielsweise eine neue Zeile in Ihrer Zeichenfolge darstellen, indem Sie Ihrem Zeichenfolgenliteral einfach zwei leicht typisierbare Zeichen hinzufügen\n
. Wenn Sie also die'hello\nworld'
Zeichenfolge drucken , werden die Wörter in separaten Zeilen gedruckt. Das ist sehr praktisch!Andererseits gibt es einige Situationen, in denen Sie ein Zeichenfolgenliteral erstellen möchten, das Escape-Sequenzen enthält, diese jedoch nicht von Python interpretiert werden sollen. Sie möchten, dass sie roh sind . Schau 'dir diese Beispiele an:
In solchen Situationen können Sie dem Zeichenfolgenliteral einfach das folgende
r
Zeichen voranstellen :r'hello\nworld'
Von Python werden keine Escape-Sequenzen interpretiert. 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 dem 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 einfach nicht, sondern lässt sie unverändert. Dies bedeutet, dass rohe Zeichenfolgenliterale noch gültige Zeichenfolgenliterale sein müssen .
Aus der lexikalischen Definition eines String-Literal:
Es ist klar, dass Zeichenfolgenliterale (roh oder nicht), die ein einfaches Anführungszeichen enthalten
'hello'world'
oder mit einem Backslash enden,'hello world\'
nicht gültig sind.quelle