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

标签 python string python-3.x replace

<分区>

我需要在 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('\\','\')

这导致:

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,但 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('\\','\') 将不起作用,因为这里的标记是 \',它转义了 ' 并等待另一个结束 '
使用 my_str.replace('\\', '') 代替


更新:再过几天,我意识到以下讨论也可能有帮助。如果带有转义符的字符串('\\x''\\u')最终是十六进制/unicode 文字,则可以通过 对其进行解码转义解码

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/

相关文章:

python - Dash Python App 按钮用于操作并刷新页面

java - JOptionPane 和 Scanner 输入问题

python - 我想使用 TOTP 将我的响应发送到 API?

python - MATLAB打开带有savemat写的汉字的.mat文件时报错

python - 谷歌云语音到文本没有为 OGG 和 MP3 文件提供输出

Python 迭代 RegEx 从定界符之间提取文本

c - 返回动态分配的副本 const char *s,而不使用标准库中除 malloc() 和 free() 之外的任何其他函数

python - 将 2d dict 的 dict 内的值除以与该键匹配的另一个 dicts 值

python - python用户名和密码恢复系统读取文件问题

python pip : cloudmonkey not installing correctly