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中,并不是三个反斜杠等于四个,而是当你跟一个字符之类的反斜杠时?
,两个一起作为两个字符出现,因为\?
它不是一个可识别的转义序列.
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)
来自字符串文字下的python词法分析页面:https: //docs.python.org/2/reference/lexical_analysis.html
有一个表列出了所有已识别的转义序列.
\\是一个转义序列,即=== \
\?是不是一个转义序列,是=== \?
所以'\\\\'是'\\'后跟'\\',即'\\'(两个转义\)
并且'\\\'是'\\'后跟'\',也是'\\'(一个转义\和一个原始\)
此外,应该注意的是,与其他语言不同,python不区分字符串文字周围的单引号和双引号.
因此'String'和"String"在python中完全相同,它们不会影响转义序列的解释.