我需要将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'
所以,没有变化。在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'