删除字符串中的反斜杠

时间:2018-09-06 09:43:28

标签: python

我正在创建一个字典,其值之一是带有反斜杠的字符串,我知道python会自动添加转义序列。但是最后,当您打印字典时,它仍在打印该值并带有多个反斜杠,现在我必须将此字典传递给不希望有多个反斜杠的另一个工具,因此当前我被迫手动删除一个反斜杠,是否有办法自动从字典值中删除反斜杠。

(Pdb) print value2
"\x01\x02\x03\x04\x05"
(Pdb) value2
'"\\x01\\x02\\x03\\x04\\x05"'

1 个答案:

答案 0 :(得分:2)

您正在将字符串表示形式与字符串混淆。

当您在Python解释器中回显字符串对象时,输出实际上是通过打印repr() function的结果而产生的。此函数输出调试友好表示形式,对于字符串,该表示形式是有效的Python语法,您可以将其复制并粘贴回Python中。

另一方面,

print只是将字符串中的实际值写入终端。这与创建值的Python语法完全不同。字符串 prints 中的反斜杠作为反斜杠,如果值中没有反斜杠,则不会看到反斜杠。

在Python字符串文字语法中,\反斜杠字符具有特殊含义,它是转义序列的第一个字符。因此,如果要在字符串的 value 中使用实际的反斜杠,则需要使用\\来“转义转义符”。还有其他反斜杠没有特殊含义的语法,但是字符串的repr()表示不使用其他语法。因此,它将在值中输出任何反斜杠作为转义序列\\

这并不意味着该值具有两个反斜杠。这只是意味着您可以复制输出,然后将其粘贴到Python中,它会产生相同的字符串值

通过查看各个字符,您可以看到您的字符串值没有双反斜杠:

>>> value2 = '"\\x01\\x02\\x03\\x04\\x05"'
>>> value2
'"\\x01\\x02\\x03\\x04\\x05"'
>>> print value2
"\x01\x02\x03\x04\x05"
>>> print value2[0]
"
>>> print value2[1]
\
>>> print value2[2]
x
>>> value2[0]
'"'
>>> value2[1]
'\\'
>>> value2[2]
'x'

打印value2[1]表明单个字符是一个反斜杠。 呼应单个字符显示'\\',这是Python语法,用于重新创建带有单个字符的字符串。

回显字典或列表或其他标准Python容器时,它们也会使用有效的Python语法回显,因此它们的内容全部通过在它们上使用repr()来显示,包括字符串:

>>> d = {'foo': value2}
>>> d
{'foo': '"\\x01\\x02\\x03\\x04\\x05"'}

同样,不是,而是字符串内容的表示形式

最重要的是,容器类型没有字符串值,因此打印字典或列表或其他标准容器类型将只显示其表示形式:

>>> print d  # shows a dictionary representation
{'foo': '"\\x01\\x02\\x03\\x04\\x05"'}
>>> print d['foo']   # shows the value of the d['foo'] string
"\x01\x02\x03\x04\x05"

您将不得不打印单个值(例如上面的d['foo']),或者从组件中创建自己的字符串值(这涉及访问所有内容并从中构建新的字符串)。容器并不是最终用户友好的值,因此Python也不会为您提供字符串值。

字符串还可以包含不可打印的字符,不具有人类可读值的字符(例如换行符或制表符),甚至可以使大多数终端使用的BELL字符当您将其中之一写给他们时。在Python 2中,str类型实际上保存字节,并且仅产生产生repr()输出时考虑的ASCII范围(值00-7F)中的可打印字符。即使您可以将这些字节解码为Latin-1或其他常用编解码器,始终都被认为是不可打印的。

因此,当您在字符串中使用\以外的特殊字符时,会在表示形式中看到:

>>> value_with_no_backslashes = "This is mostly ASCII with a \b bell and a newline:\nSome UTF-8 data: "
>>> print value_with_no_backslashes  # works because my terminal accepts UTF-8
This is mostly ASCII with a bell and a newline:
Some UTF-8 data: 
>>> value_with_no_backslashes
'This is mostly ASCII with a \x08 bell and a newline:\nSome UTF-8 data: \xf0\x9f\xa6\x8a'

现在,当我回显该值时,会出现反斜杠,以确保可以轻松复制不可打印的字符并再次再现相同的值。请注意,这些反斜杠在回显语法中未加倍

请注意,表示形式是 Python特定的,仅应用于辅助调试。将它们写入日志很好,但不能使用它们在程序之间传递值。始终使用序列化格式在程序之间进行通信,包括作为子进程启动或通过将输出写入终端而启动的命令行工具。 Python内置JSON support,并且对于Python到Python的序列化没有第三方干扰的机会,pickle几乎可以用于任何Python数据结构。