从字符串中去除转义字符

9

我想将此字符串转换为:

a = '\\a'

转换成这个

b = '\a'

使用replace似乎没有明显的方法可以完成这个操作?

更准确地说,我想将反斜杠的转义更改为转义字符a


1
\ 是将反斜杠插入字符串的一种方式。而 \a 表示你正在转义字符 a。为了避免这样的情况发生,你需要通过在它之前再放一个反斜杠来转义反斜杠的特殊含义。Python 打印出来的是 \\a,但实际上只有两个字符:反斜杠和 a - Maciej Gol
1
try print(a). - inspectorG4dget
你正在使用Python 2还是Python 3? - PM 2Ring
我的实际示例中不包含'a',而是包含''\x2D",它打印出来像一个减号。这就是应该的,问题在于我得到的字符串被添加了一个额外的反斜杠,因此当我打印时,得到的字符串不包含减号,而是"\x2D"。我想要能够将一个转换为另一个。 - elelias
根据评论,目标是从实际包含反斜杠、小写x、数字2和大写D的字符串(就好像在代码中写了“\ x2d”)转换为实际包含减号的字符串(就好像在代码中写了“\x2d”)。我已经将其作为重复关闭。 - Karl Knechtel
显示剩余4条评论
3个回答

9

字符'\a'是ASCII编码中的BEL字符,chr(7)。

在Python 2中进行转换的方法:

from __future__ import print_function
a = '\\a'
c = a.decode('string-escape')
print(repr(a), repr(c))

输出

'\\a' '\x07'

以后提醒一下,在Python 3中:

a = '\\a'
b = bytes(a, encoding='ascii')
c = b.decode('unicode-escape')
print(repr(a), repr(c))

这与上面的片段产生相同的输出。

在Python 3中,如果您正在使用字节对象,则可以执行以下操作:

a = b'\\a'
c = bytes(a.decode('unicode-escape'), 'ascii')
print(repr(a), repr(c))

输出

b'\\a' b'\x07'

正如Antti Haapala所提到的,如果源字符串中包含unicode字符,则这种Python 3的简单策略将无法奏效。在这种情况下,请参阅他的答案以获得更强大的解决方案。


6
在Python 2中,您可以使用以下方法:
>>> '\\a'.decode('string_escape')
'\x07'

请注意,\a 被表示为 \x07
如果该字符串是一个包含扩展字符的Unicode字符串,则需要先将其解码为字节串,否则默认编码(ascii!)将首先用于将Unicode对象转换为字节串。
然而,在Python 3中不存在这种编解码器,事情变得更加复杂。您可以使用 unicode-escape 进行解码,但如果源字符串也包含Unicode字符,则会非常不稳定。
>>> '\aäầ'.encode().decode('unicode_escape')
'\x07äầ'

结果字符串不是由Unicode字符组成,而是解码为Latin-1的字节。解决方法是重新编码为Latin-1,然后再次解码为utf8:

>>> '\\aäầ\u1234'.encode().decode('unicode_escape').encode('latin1').decode()
'\x07äầሴ'

2

Unescape string是我搜索到的内容:

>>> a = r'\a'
>>> a.encode().decode('unicode-escape')
'\x07'
>>> '\a'
'\x07'

这是使用Unicode的方法。由于您使用的是Python 2,可能没有使用Unicode,您实际上可能需要一个:
>>> a.decode('string-escape')
'\x07'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接