This question already has answers here:
Python Replace \\ with \
(7个答案)
3年前关闭。
我需要在复杂字符串中用python3中的
这也是与this one不同的,在这里
假设字符串为:
直截了当的方法是:
这导致:
此answer建议使用:
结果是:
因此,没有变化。
这个answer建议:
但这不适用于如此复杂的字符串:
使用解码(如建议的here)会导致:
使用
而且
改用
更新:再过几天,我意识到以下讨论也可能会有所帮助。如果带有转义符的字符串的含义(
(7个答案)
3年前关闭。
我需要在复杂字符串中用python3中的
\\
替换\
。我知道这个问题已经被问过几次了,但是大多数情况下都是针对简单的字符串,因此,(接受的)答案中的任何一个都不真正适用于复杂的字符串。这也是与this one不同的,在这里
.decode('unicode_escape')
可以解决问题,但该问题不适用于该问题。 参见下面的。假设字符串为:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
直截了当的方法是:
my_str.replace('\\','\')
这导致:
此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')
但这不适用于如此复杂的字符串:
使用解码(如建议的here)会导致:
my_str.decode('unicode_escape')
使用
unicode_esacpe
进行编码和解码的组合会返回一个完全不同的字符串(可能是由于使用了utf-16
,但是utf-8
会导致错误,请参见上文。另外,例如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'
最佳答案
仔细看看字符串,它们都是单斜线。
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('\\','\')
将不起作用,因为此处的 token 是\'
,它会转义'
并等待另一个结束的'
。改用
my_str.replace('\\', '')
更新:再过几天,我意识到以下讨论也可能会有所帮助。如果带有转义符的字符串的含义(
'\\x'
或'\\u'
)最终是十六进制/unicode文字,则可以用escape_decode
对其进行解码。import codecs
print(len(b'\x32'), b'\x32') # 1 hex literal, '\x32' == '2'
print(len(b'\\x32'), b'\\x32') # 4 chars including escapes
print(codecs.escape_decode('\\x32', 'hex')) # chars->literal, 4->1
# 1 b'2'
# 4 b'\\x32'
# (b'2', 4)
s = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
ed, _ = codecs.escape_decode(s, 'hex')
print(len(s), s)
print(len(ed), ed)
# 49 \xa5\xc0\xe6aK\xf9\x80\xb1\xc8*$\xfbp(4\xd6{;Z
# 22 b'\xa5\xc0\xe6aK\xf9\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'
关于python3用单反斜杠替换双反斜杠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50199840/
10-15 15:59