Python如何解释字符串中的反斜杠?

时间:2019-10-06 04:33:13

标签: python

尽管我注意到了这种模式,但是理论上反斜杠在字符串中如何工作?

'@#2_#]&*^%$\]'

输出'@#2_#]&*^%$\\]'

'@#2_#]&*^%$\\]'

输出'@#2_#]&*^%$\\]'

'@#2_#]&*^%$\\\]'

输出'@#2_#]&*^%$\\\\]'

3 个答案:

答案 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'

但是如果字符串包含两种引号,它将切换回单引号:

>>> '\'\'\''
"'''"

(练习:该字符串中实际上有多少个字符,它们是什么?字符串中包含多少个反斜杠?)

  

它包含两个字符-单引号和双引号-和反斜杠。

相关问题