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 \rund 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 .