尽管我注意到了这种模式,但是理论上反斜杠在字符串中如何工作?
'@#2_#]&*^%$\]'
输出:'@#2_#]&*^%$\\]'
'@#2_#]&*^%$\\]'
输出:'@#2_#]&*^%$\\]'
'@#2_#]&*^%$\\\]'
输出:'@#2_#]&*^%$\\\\]'
答案 0 :(得分:1)
反斜杠\字符用于转义具有特殊含义的字符,例如换行符,反斜杠本身或引号字符。字符串文字可以选择以字母“ r”或“ R”为前缀;这样的字符串称为原始字符串,并对反斜杠转义序列使用不同的规则。
除非存在'r'或'R'前缀,否则字符串中的转义序列将根据类似于标准C使用的规则进行解释。
与标准C严格兼容,最多可以接受三个八进制数字,但是十六进制转义的一部分将使用不限数量的十六进制数字(然后在8中使用所得十六进制数字的低8位)位实现)。
与标准C不同,所有无法识别的转义序列都保留在字符串中,即字符串中保留了反斜杠。 (此行为在调试时很有用:如果转义序列输入错误,则更容易将输出结果识别为损坏。)
当存在'r'或'R'前缀时,反斜杠仍用于引用以下字符,但是所有反斜杠都保留在字符串中。例如,字符串文字r“ \ n”由两个字符组成:反斜杠和小写字母'n'。可以使用反斜杠对字符串引号进行转义,但反斜杠仍保留在字符串中;例如,r“ \”“是由两个字符组成的有效字符串文字:反斜杠和双引号; r” \“不是值字符串文字(即使原始字符串也不能以奇数个反斜杠结尾)。具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义以下引号字符),还请注意,单个反斜杠后跟换行符会被解释为这两个字符是字符串的一部分,而不是换行符
答案 1 :(得分:0)
第一个模式
BINARY(16)
'@#2_#]&*^%$\]'
不会被转义,因此在输出中又添加了一个\
以对其进行转义。
对于第二种模式
\
'@#2_#]&*^%$\\]'
已在模式中转义,因此输出中没有新的\
。
对于第三种模式
\
的第一个'@#2_#]&*^%$\\\]'
逃脱了第二个\
和第三个
通过在输出中再添加一个\
来逃避\
。所以有四个\
。
希望对您有所帮助。
答案 2 :(得分:0)
来自您的后续评论:
在我的示例中,令我感到困惑的是,它无法逃脱。单反斜杠产生双反斜杠。双反斜杠产生双反斜杠。三反斜杠产生四反斜杠.....
请注意:您的第一个输出是一个字符串,其中带有一个反斜杠。 Python在其字符串的表示形式中显示两个反斜杠。
当您输入带有单个反斜杠的字符串时,Python不会将输入中的序列\]
视为任何特殊的转义序列,因此\
会在实际中变成实际的反斜杠字符串,然后将]
放在一个方括号中。引用由Klaus D.链接的documentation:
与标准C不同,所有无法识别的转义序列都保留在字符串中,即反斜杠留在结果中。 (此行为在调试时很有用:如果转义序列输入错误,则更容易将输出结果识别为损坏。)
当您输入带有双反斜杠的字符串时,序列\\
是单反斜杠的转义序列,然后]
只是{{1 }}。
无论哪种方式,当Python将字符串显示回给您时,它都将]
用作单个实际的反斜杠,因为它不会预先确定单个反斜杠是否可以工作-反斜杠总是被转义。 / p>
进入更多细节:Python并不关心您如何首先指定字符串-它具有特定的“规范化”形式,仅取决于字符串实际包含的内容。我们可以通过使用不同的方式来引用字符串来看到这一点:
\\
如果避免单引号的转义序列,则规范化形式将使用双引号:
>>> 'foo'
'foo'
>>> "foo"
'foo'
>>> r'foo'
'foo'
>>> """foo"""
'foo'
但是如果字符串包含两种引号,它将切换回单引号:
>>> '\'\'\''
"'''"
(练习:该字符串中实际上有多少个字符,它们是什么?字符串中包含多少个反斜杠?)
它包含两个字符-单引号和双引号-和否反斜杠。