Dies liegt daran, dass Backslash als Escape-Zeichen für die unmittelbar darauf folgenden Zeichen fungiert, wenn die Kombination eine gültige Escape-Sequenz darstellt. Die rund ein Dutzend Escape-Sequenzen sind hier aufgelistet . Dazu gehören die offensichtlichen wie Zeilenumbruch \n
, horizontale Registerkarte \t
, Wagenrücklauf \r
und dunkelere wie benannte Unicode-Zeichen \N{...}
, die beispielsweise \N{WAVY DASH}
Unicode-Zeichen darstellen \u3030
. Der entscheidende Punkt ist jedoch, dass, wenn die Escape-Sequenz nicht bekannt ist, die Zeichenfolge unverändert in der Zeichenfolge verbleibt.
Ein Teil des Problems könnte auch sein, dass die Python-Interpreter-Ausgabe Sie irreführt. Dies liegt daran, dass die Backslashes bei der Anzeige maskiert werden. Wenn Sie diese Zeichenfolgen jedoch drucken , werden die zusätzlichen Backslashes ausgeblendet.
>>> '?\\\?'
'?\\\\?'
>>> print('?\\\?')
?\\?
>>> '?\\\?' == '?\\?' # I don't know why you think this is True???
False
>>> '?\\\?' == r'?\\?' # but if you use a raw string for '?\\?'
True
>>> '?\\\\?' == '?\\\?' # this is the same string... see below
True
Für Ihre spezifischen Beispiele entgeht im ersten Fall '?\\\?'
der erste \
dem zweiten Backslash und hinterlässt einen einzelnen Backslash, während der dritte Backslash als Backslash verbleibt, da \?
es sich nicht um eine gültige Escape-Sequenz handelt. Daher ist die resultierende Zeichenfolge ?\\?
.
Im zweiten Fall '?\\\\?'
entgeht der erste Backslash dem zweiten und der dritte Backslash dem vierten, was zur Zeichenfolge führt ?\\?
.
Deshalb sind drei Backslashes gleich vier:
>>> '?\\\?' == '?\\\\?'
True
Wenn Sie eine Zeichenfolge mit 3 Backslashes erstellen möchten, können Sie jeden Backslash umgehen:
>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
oder Sie finden "rohe" Zeichenfolgen verständlicher:
>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
Dadurch wird die Escape-Sequenzverarbeitung für das Zeichenfolgenliteral aktiviert. Weitere Informationen finden Sie unter String-Literale .