当前位置: 首页 > 知识库问答 >
问题:

python3将双反斜杠替换为单反斜杠[重复]

孟乐
2023-03-14

我需要将python3中的\\替换为复杂字符串中的\。我知道这个问题已经被问了好几次,但大多数时候都是针对简单字符串,所以没有一个(接受的)答案真正适用于复杂字符串。

这也不同于使用可以解决问题的情况。decode('unicodeescape')无法解决此问题。请参见下文。

假设字符串是:

my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'

直截了当的方法是:

my_str.replace('\\','\')

这导致:

语法错误:扫描字符串文字时EOL

这个答案建议使用:

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')

但是对于如此复杂的字符串,这并不适用:

unicodeescape错误:“unicodeescape”编解码器无法解码位置49-50处的字节:截断\xXX escape

使用解码(如此处所建议)会导致:

my_str.decode('unicode_escape')

属性错误:'my_str'对象没有属性'解码'

使用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'

共有2个答案

周健
2023-03-14

如果您这样做

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中没有任何双精度\-它只是这样显示它,如果您检查它,请将其与用于转义内容的\区分开来。

如果您< code>print(s)您将得到< code > \ xa5 \ xc0 \ xe6aK \ xf9 \ X80 \ xb1 \ xc8 * $ \ xfbp(4 \ xd6 {;Z\x

郝玄天
2023-03-14

细看一下串,都是单斜杠

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替换(“\\”、“”)

更新:又过了几天,我意识到下面的讨论也可能有所帮助。如果带有转义的字符串'\\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'
 类似资料:
  • 问题内容: 我有一个字符串“ \\ u003c”,它属于UTF-8字符集。由于存在双反斜杠,因此我无法将其解码为unicode。如何从“ \\ u003c”获取“ \ u003c”?我正在使用Java。 我尝试过 但无法实现我想要的。 这是我的代码 文件的内容是 \ u003c 问题答案: 不知道您是否仍在寻找解决问题的方法(因为您已经接受了答案),但是我仍然会添加我的答案作为针对 所述问题 的可

  • 许多发现都是针对python2的,我的例子是python3: 我需要把双背斜线换成单背斜线 这篇文章中的“接受答案”python3用单反斜杠替换双反斜杠在这里不起作用: 那么问题出在哪里呢?非常感谢。 [更新]: 由于@ShadowRanger的回复,所以如果在替换操作后打印字符串,它是预期的,但是,在我的情况下,我需要连接替换后生成另一个变量(conn_str),正如你所看到的,它仍然显示双反斜

  • 我有以下路径:,我想将其转换为: 我试图将上面的路径附加到这个路径:with但是当我将两个字符串附加在一起时,这是输出: 下面是有问题的代码: 由于斜杠的原因,附加的路径未被视为文件夹。有什么帮助吗? 编辑:只是澄清一下,完整路径(两个附加字符串)实际上是一个文件夹。

  • 问题内容: 这是一个“到底发生了什么”的问题。我实际上不需要解决方案。 我必须用双反斜杠替换字符串中的所有单反斜杠。这就是我最终要做的… …其中strRootDirectory是上面的java.lang.String。 现在,我了解了第一个参数的四个反斜杠:regex期望两个反斜杠以表示单个文字反斜杠,而Java希望它们加倍。没关系。 但是,第二个参数的八个反斜杠到底是怎么回事?替换字符串不是应该

  • 问题内容: 我正在尝试将转换为,但是我不断遇到各种错误。我认为这是解决方案: 但这给出了以下异常: 问题答案: 将该参数解释为正则表达式。该是转义字符都 和。你需要对正则表达式进行两次转义: 但是你不必为此使用正则表达式,仅是因为你希望逐个字符地进行精确替换,并且这里不需要模式。因此就足够了: 更新:根据注释,你似乎想在JavaScript上下文中使用字符串。你最好使用它来覆盖更多字符。

  • 我正在尝试用单个反斜杠替换所有双反斜杠。我想将替换为。我以为python将视为一个反斜杠,将视为带有两个反斜杠的字符串。但是当我尝试时 因此,我尝试用原始字符串切换替换字符串: 这不是我需要的。所以我只尝试了原始字符串中的一个反斜杠: