这是因为如果组合表示有效的转义序列,则反斜杠将作为紧随其后的字符的转义字符。 这里列出了十几个转义序列。 它们包括明显的那些,例如换行'?\\\\?',水平标签?\\?,回车\?以及更加模糊的那些,例如使用?\\?的命名的unicode字符。 \N{WAVY DASH}表示unicode字符\u3030。但关键点是如果转义序列未知,则字符序列将保留在字符串中。
部分问题也可能是Python解释器输出误导了你。 这是因为反斜杠在显示时会被转义。 但是,如果您打印这些字符串,您将看到额外的反斜杠消失。
>>> '?\\\?'
'?\\\\?'
>>> 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
对于您的具体示例,在第一种情况下'?\\\\?',第一个?\\?转义第二个反斜杠,留下一个反斜杠,但第三个反斜杠仍然是反斜杠,因为\?不是有效的转义序列。 因此,结果字符串是?\\?。
对于第二种情况'?\\\\?',第一个反斜杠转义第二个,第三个反斜杠转义第四个,导致字符串?\\?。
这就是为什么三个反斜杠与四个相同的原因:
>>> '?\\\?' == '?\\\\?'
True
如果要创建带有3个反斜杠的字符串,则可以转义每个反斜杠:
>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
或者你可能会发现" raw" 字符串更容易理解:
>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
这转换为字符串文字的转义序列处理。 有关详细信息,请参阅字符串文字。