为什么Python字符串中的3个反斜杠等于4?

koz*_*ooh 90 python python-2.7

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

>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
Run Code Online (Sandbox Code Playgroud)

Dan*_*tin 84

基本上,因为python在反斜杠处理方面略显宽松.引自https://docs.python.org/2.0/ref/strings.html:

与标准C不同,所有未识别的转义序列都保留在字符串中不变,即反斜杠保留在字符串中.

(重点原文)

因此,在python中,并不是三个反斜杠等于四个,而是当你跟一个字符之类的反斜杠时?,两个一起作为两个字符出现,因为\?它不是一个可识别的转义序列.

  • 不,与lenient相反的是在使用无法识别的反斜杠转义时引发错误.(正如几乎所有编译语言都要做的那样.请记住,Python的字符串处理基本上是"像C一样,除非我们在传递无效的反斜杠时不会爆炸")另外,在字符串中,无论语言是什么,只有两个字符需要转义 - 无论你使用什么作为分隔符,反斜杠本身.我不明白这两个人很难记住的论点. (24认同)
  • 这与宽大相反.Lenient是大多数人*其他人的*行为"如果你反斜杠一个不需要它的角色,反斜杠什么都不做".再加上另一个惯例(反斜杠字母数字可能会让它们变得特别,但反斜杠标点符号总是让它变得不特别),你会得到一个非常好的属性,你可以通过反斜杠所有标点来安全地修改字符串,而不必知道哪些字符是特殊的interpeted - Python缺乏的属性. (6认同)

mha*_*wke 30

这是因为如果组合表示有效的转义序列,则反斜杠将作为紧随其后的字符的转义字符.这里列出了十几个转义序列.它们包括明显的那些,例如换行符\n,水平制表符\t,回车符\r和更模糊的那些,例如命名的unicode字符\N{...},例如\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
Run Code Online (Sandbox Code Playgroud)

对于您的具体示例,在第一种情况下'?\\\?',第一个\转义第二个反斜杠,只留下一个反斜杠,但第三个反斜杠仍然是反斜杠,因为\?它不是有效的转义序列.因此得到的字符串是?\\?.

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

这就是为什么三个反斜杠与四个相同的原因:

>>> '?\\\?' == '?\\\\?'
True
Run Code Online (Sandbox Code Playgroud)

如果要创建带有3个反斜杠的字符串,则可以转义每个反斜杠:

>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
Run Code Online (Sandbox Code Playgroud)

或者您可能会发现"原始"字符串更容易理解:

>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
Run Code Online (Sandbox Code Playgroud)

这转换为字符串文字的转义序列处理.有关详细信息,请参阅字符串文字.


the*_*aul 13

因为\x在一个字符串,如果x不是特殊字符backslashable等中的一个n,r,t,0,等评估用反斜杠,然后一个一个串x.

>>> '\?'
'\\?'
Run Code Online (Sandbox Code Playgroud)


rkh*_*rkh 7

来自字符串文字下的python词法分析页面:https: //docs.python.org/2/reference/lexical_analysis.html

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

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

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

所以'\\\\'是'\\'后跟'\\',即'\\'(两个转义\)

并且'\\\'是'\\'后跟'\',也是'\\'(一个转义\和一个原始\)

此外,应该注意的是,与其他语言不同,python不区分字符串文字周围的单引号和双引号.

因此'String'和"String"在python中完全相同,它们不会影响转义序列的解释.