为什么3个反斜杠在Pythonstring中等于4?

你能告诉我为什么'?\\\?'=='?\\\\?'True ? 这让我疯狂,我找不到合理的答案…

 >>> list('?\\\?') ['?', '\\', '\\', '?'] >>> list('?\\\\?') ['?', '\\', '\\', '?'] 

基本上,因为Python在反斜杠处理方面略微宽松。 从https://docs.python.org/2.0/ref/strings.html引用:;

与标准C不同,所有无法识别的转义序列都保留在string中,即反斜杠保留在string中

(重点在原来的)

因此,在python中,三个反斜杠不等于四,就是当你跟着一个字符反斜杠的时候? ,两人一起来过两个人物,因为\? 不是一个公认的转义序列。

这是因为如果组合表示有效的转义序列,反斜杠将作为紧跟其后的字符的转义字符。 这里列出了十几个转义序列。 它们包括诸如换行符\n ,水平制表符\t ,回车符\r以及诸如使用\N{...}命名unicode字符,比如\N{WAVY DASH} \u3030 。 关键点在于,如果转义序列是未知的,则字符序列保留在string中。

部分问题也可能是Python解释器的输出会误导你。 这是因为反斜杠在显示时被转义。 但是,如果您打印这些string,则会看到额外的反斜杠消失。

 >>> '?\\\?' '?\\\\?' >>> 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 

对于你的具体例子,在第一个例子中'?\\\?' ,第一个\退出第二个反斜杠留下一个反斜杠,但第三个反斜杠仍然是一个反斜杠,因为\? 不是有效的转义序列。 因此得到的string是?\\?

对于第二种情况'?\\\\?' ,第一个反斜杠转义第二个,第三个反斜杠转义第四个导致​​string?\\?

所以这就是为什么三个反斜杠和四个一样:

 >>> '?\\\?' == '?\\\\?' True 

如果你想创build一个带有3个反斜杠的string,你可以将每个反斜杠转义出来:

 >>> '?\\\\\\?' '?\\\\\\?' >>> print('?\\\\\\?') ?\\\? 

或者你可能会发现“原始”string更容易理解:

 >>> r'?\\\?' '?\\\\\\?' >>> print(r'?\\\?') ?\\\? 

这个转义string文字的转义序列处理。 有关更多细节,请参阅string文字 。

因为\x在一个string中,当x不是像nrt0等那样的特殊可逆字符之一时,计算出一个带有反斜杠和x的string。

 >>> '\?' '\\?' 

从string文字下的python词法分析页面: https : //docs.python.org/2/reference/lexical_analysis.html

有一个表列出了所有识别的转义序列。

\\是一个转义序列=== \

\? 是不是一个转义序列,是=== \?

所以'\\\'是'\\',后面是'\\',这是'\\'(两个逃脱)

'\\'是'\\',后面跟'\'也是'\\'(一个是\和一个raw \)

另外,应该指出的是,python不区分单词和双引号围绕string文字,不像其他一些语言。

所以'String'和'String'在python中是完全一样的,它们不会影响转义序列的解释。

mhawke的回答几乎涵盖了它,我只是想用更简洁的forms来重述它,并用最less的例子来说明这种行为。

我猜想有一点需要补充的是,转义处理是从左到右移动的,所以\n首先find反斜杠,然后寻找一个字符来逃跑,然后findn并逃脱它; \\nfind第一个反斜杠,find第二个并将其转义,然后findn并将其视为字面n; \? 发现反斜杠,并寻找一个字符逃脱,发现? 这是不能逃脱的,所以把\作为一个文字反斜杠。

正如mhawke指出的那样,这里的关键是交互式解释器在显示string时转义反斜杠。 我猜的原因是确保从解释器复制到代码编辑器的文本string是有效的Pythonstring。 但是,在这种情况下,为了方便起见,这种补贴会造成混乱。

 >>> print('\?') # \? is not a valid escape code so backslash is left as-is \? >>> print('\\?') # \\ is a valid escape code, resulting in a single backslash '\?' >>> '\?' # same as first example except that interactive interpreter escapes the backslash \\? >>> '\\?' # same as second example, backslash is again escaped \\?