Ignorieren (Deaktivieren) von Escape-Sequenzen in Python mit rohen Zeichenketten

Geschäft

'...', "..."Wenn Sie in Python diesen String-Literalen eines der folgenden Zeichen voranstellen, wird der Wert zu einem String, ohne die Escape-Sequenz zu erweitern.

  • r
  • R

Nützlich beim Umgang mit Zeichenketten, die viele Backslashes verwenden, wie Windows-Pfade und Muster für reguläre Ausdrücke.
Hier finden Sie die folgenden Informationen.

  • Escape-Sequenz
  • Escape-Sequenzen in rohen Zeichenketten ignorieren (deaktivieren)
  • Normale Zeichenkette in rohe Zeichenkette umwandeln:repr()
  • Beachten Sie den Backslash am Ende.

Escape-Sequenz

In Python werden Zeichen, die nicht in einer normalen Zeichenkette dargestellt werden können (z. B. Tabulatoren und Zeilenumbrüche), durch Escape-Sequenzen mit Backslashes beschrieben, ähnlich wie in der Sprache C. Ein Beispiel für eine Escape-Sequenz ist unten dargestellt.

  • \t
  • \n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B

Escape-Sequenzen in rohen Zeichenketten ignorieren (deaktivieren)

'...', "..."Wenn Sie einem solchen Zeichenkettenliteral eines der folgenden Zeichen voranstellen, wird der Wert zu einer Zeichenkette, ohne die Escape-Sequenz zu erweitern. Eine solche Zeichenkette wird raw string genannt.

  • r
  • R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB

Es gibt keinen speziellen Typ namens raw string type, er ist einfach ein String-Typ und entspricht einem normalen String mit einem Backslash, der wie folgt dargestellt wird
\\

print(type(rs))
# <class 'str'>

print(rs == 'a\\tb\\nA\\tB')
# True

In einer normalen Zeichenkette wird eine Escape-Sequenz als ein Zeichen betrachtet, aber in einer rohen Zeichenkette werden auch Backslashes als Zeichen gezählt. Die Länge der Zeichenfolge und jedes Zeichens ist wie folgt.

print(len(s))
# 7

print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']

print(len(rs))
# 10

print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']

Windows Pfad

Die Verwendung der rohen Zeichenfolge ist nützlich, wenn Sie einen Windows-Pfad als Zeichenfolge darstellen möchten.

Windows-Pfade werden durch Backslashes getrennt. Wenn Sie also eine normale Zeichenkette verwenden, müssen Sie den Pfad wie folgt entschlüsseln, aber wenn Sie eine rohe Zeichenkette verwenden, können Sie sie so schreiben, wie sie ist. Die Werte sind gleichwertig.
\\

path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True

Beachten Sie, dass eine Zeichenfolge, die mit einer ungeraden Anzahl von Backslashes endet, zu einem Fehler führt, wie unten beschrieben. In diesem Fall ist es notwendig, die Zeichenkette als normale Zeichenkette zu schreiben oder sie zu verketten, indem nur das Ende der Zeichenkette als normale Zeichenkette geschrieben wird.

path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True

Normale Zeichenketten mit repr() in rohe Zeichenketten umwandeln

Wenn Sie eine normale Zeichenkette in eine rohe Zeichenkette umwandeln wollen, wobei Sie Escape-Sequenzen ignorieren (deaktivieren), können Sie die eingebaute Funktion repr() verwenden.

s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'

repr() gibt eine Zeichenkette zurück, die ein Objekt so darstellt, dass sie denselben Wert hat wie bei der Übergabe an eval(), mit führenden und nachfolgenden Zeichen.

print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]

Mit Hilfe von Slices können wir eine Zeichenkette erhalten, die der rohen Zeichenkette mit angehängtem r entspricht.

s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB

print(s_r2 == rs)
# True

print(r'\t' == repr('\t')[1:-1])
# True

Beachten Sie den Backslash am Ende.

Da ein Backslash das unmittelbar folgende Anführungszeichen umgeht, tritt ein Fehler auf, wenn am Ende der Zeichenfolge eine ungerade Anzahl von Backslashes steht. Eine gerade Anzahl von Backslashes ist OK.

# print(r'\')
# SyntaxError: EOL while scanning string literal

print(r'\\')
# \\

# print(r'\\\')
# SyntaxError: EOL while scanning string literal