Dor*_*ore 4 python string python-3.x
我在Python 3.4 shell中使用转义反斜杠进行了一些实验,并注意到一些非常奇怪的事情.
>>> string = "\test\test\1\2\3"
>>> string
'\test\test\x01\x02\x03'
>>> string = "5"
>>> string
'5'
>>> string = "5\6\7"
>>> string
'5\x06\x07'
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中看到的,我将变量字符串定义为"\test\test\1\2\3".但是,当我进入string控制台而不是打印时"\test\test\1\2\3",它会打印出来"\test\test\x01\x02\x03".为什么会发生这种情况,它用于什么?
在Python字符串文字中,\字符启动转义序列.\n转换为换行符,\t选项卡等.\xhh十六进制序列允许您生成具有十六进制值的\uhhhh代码点,生成具有4位十六进制值的\Uhhhhhhhh代码点,并生成具有8位十六进制值的代码点.
请参阅String和Bytes Literals文档,其中包含所有可能的转义序列的表.
当Python在解释器中回显一个字符串对象(或者在字符串对象上使用该repr()函数)时,Python会创建字符串值的表示.该表示恰好使用完全相同的Python字符串文字语法,以便更容易调试您的值,因为您可以使用该表示来重新创建完全相同的值.
为了防止不可打印的字符造成破坏或根本不显示,Python使用相同的转义序列语法来表示这些字符.因此,不可打印的字节使用合适的\xhh序列来表示,或者如果可能的话,使用\c单个字母转义之一(因此换行符显示为\n).
在您的示例中,您使用\ooo 八进制值转义序列语法创建了不可打印的字节.数字被解释为八进制数以创建相应的代码点.当回显该字符串值时,默认\xhh语法用于表示十六进制的完全相同的值:
>>> '\20' # Octal for 16
'\x10'
Run Code Online (Sandbox Code Playgroud)
而你\t成为一个标签字符:
>>> print('\test')
est
Run Code Online (Sandbox Code Playgroud)
注意那里没有信t; 相反,剩下的est是用空格缩进,一个水平制表符.
如果需要包含文字 \反斜杠字符,则需要将字符加倍:
>>> '\\test\\1\\2\\3'
'\\test\\1\\2\\3'
>>> print('\\test\\1\\2\\3')
\test\1\2\3
>>> len('\\test\\1\\2\\3')
11
Run Code Online (Sandbox Code Playgroud)
请注意,表示使用了双倍的反斜杠!如果没有,您将无法复制该字符串并将其粘贴回Python以重新创建该值.使用print()将值作为实际字符(而不是字符串表示)写入终端显示那里有单个反斜杠,并且取长度显示字符串中只有11个字符,而不是15个字符.
您还可以使用原始字符串文字.这只是一种不同的语法,从语法创建的字符串对象是完全相同的类型,具有相同的值.它只是拼写字符串值的另一种方式.在原始字符串文字中,反斜杠只是反斜杠,只要它们不是字符串中的最后一个字符; 大多数转义序列在原始字符串文字中不起作用:
>>> r'\test\1\2\3'
'\\test\\1\\2\\3'
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的,如果您要在Windows系统上创建表示文件名的字符串,您还可以使用正斜杠; Window中的大多数API都不介意并接受两种类型的斜杠作为文件名中的分隔符:
>>> 'C:/This/is/a/valid/path'
'C:/This/is/a/valid/path'
Run Code Online (Sandbox Code Playgroud)