我需要在复杂字符串中用python3中的\\
替换\
。我知道这个问题已被多次询问过,但大部分时间都是简单的字符串,所以(接受的)答案都不适用于复杂的字符串。
这与[{3}}的不同也可以通过.decode('unicode_escape')
来解决问题,但这不适用于此问题。 见下文。
假设字符串是:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
直接的方法是:
my_str.replace('\\','\')
导致:
SyntaxError:扫描字符串文字时的EOL
这this one建议使用:
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'编解码器无法解码位置49-50中的字节:truncated \ xXX escape
使用解码(建议answer)会导致:
my_str.decode('unicode_escape')
AttributeError:' my_str'对象没有属性' decode'
使用unicode_esacpe
进行编码和解码的组合会返回一个完全不同的字符串(可能是由于使用utf-16
,但utf-8
会导致错误,请参阅上文。另外,例如{ {1}}无效):
latin1
答案 0 :(得分:3)
仔细看看字符串,它们都是单斜线。
let arr = [{time: 1525355921817, sym: "AAPL", price: 169.16, size: 98, stop: false,},{time: 1525355923216, sym: "AAPL", price: 170.15, size: 6, stop: false,},{time: 1525355923216, sym: "AAPL", price: 170.06, size: 57, stop: false,}];
let result = arr.map(({size,stop,...r}, i) => Object.assign(r, {index: i}));
console.log( result );
并且In [26]: my_str[0]
Out[26]: '\\'
In [27]: my_str[1]
Out[27]: 'x'
In [28]: len(my_str[0])
Out[28]: 1
无法正常工作,因为此处的令牌为my_str.replace('\\','\')
,它会转义\'
并等待另一个结束'
。
请改用'
更新:再过几天,我意识到以下讨论也可能有所帮助。如果带有转义(my_str.replace('\\', '')
或'\\x'
)的字符串的内涵最终是十六进制/ unicode文字,则它们可以由'\\u'
解码。
escape_decode
答案 1 :(得分:1)
如果你这样做
s = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
s = s.replace('\\','\')
print(s)
你得到了
File "main.py", line 3
s = s.replace('\\','\')
^
SyntaxError: EOL while scanning string literal
因为在'\'
中,\ {转义'
。你的字符串保持打开状态。
你在s
中没有任何双重\ _它只是显示它,如果你检查它,请将它与用于逃避内容的\
区分开来。< / p>
如果您print(s)
获得\xa5\xc0\xe6aK\xf9\x80\xb1\xc8*$\xfbp(4\xd6{;Z\x