python3用单反斜杠替换双反斜杠

时间:2018-05-06 12:44:19

标签: python string python-3.x replace

我需要在复杂字符串中用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

2 个答案:

答案 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