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 ;-).