我需要将python3中的\\
替换为复杂字符串中的\
。我知道这个问题已经被问过好几次了,但是大多数时间都是针对简单字符串的,所以没有一个(公认的)答案真正适用于复杂字符串。在
这也与this one不同,后者可以用.decode('unicode_escape')
来解决问题,但对这个问题不起作用。见下文。在
假设字符串为:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
直接的方法是:
^{pr2}$这导致:
SyntaxError: EOL while scanning string literal
这answer建议使用:
my_str.replace('\\\\','\\')
结果是:
'\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
所以,没有变化。在
这answer表明:
b = bytes(my_str, encoding='utf-8')
b.decode('unicode-escape')
但这对如此复杂的字符串不起作用:
UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position 49-50: truncated \xXX escape
使用解码(如建议的here)会导致:
my_str.decode('unicode_escape')
AttributeError: 'my_str' object has no attribute 'decode'
使用unicode_esacpe
进行编码和解码的组合将返回一个完全不同的字符串(可能是由于使用了utf-16
,但是{latin1
不起作用):
my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'
如果你这么做的话
你得到了
^{pr2}$因为在
'\'
中\转义了'
。你的绳子开着。在你没有任何双精度的
s
-它只是显示了它本身,如果你检查它,就要把它与用来逃逸的\
区分开来。在如果你
print(s)
你得到\xa5\xc0\xe6aK\xf9\x80\xb1\xc8*$\xfbp(4\xd6{;Z\x
仔细看看这串线,它们都是单斜线。在
并且
my_str.replace('\\','\')
不起作用,因为这里的令牌是\'
,它转义'
,并等待另一个结束'
。请改用
my_str.replace('\\', '')
更新:再过几天,我意识到下面的讨论可能也有帮助。如果带有转义符(
^{pr2}$'\\x'
或'\\u'
)的字符串的内涵最终是十六进制/unicode文本,则可以通过escape_decode
对它们进行解码。在相关问题 更多 >
编程相关推荐