46

我有一个字符串。在该字符串中是双反斜杠。我想用单个反斜杠替换双反斜杠,以便可以正确解析 unicode char 代码。

(Pdb) p fetched_page
'<p style="text-align:center;" align="center"><strong><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0<\\/span><\\/strong><\\/p>\n<p><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0 in \\u201cDreaming in Code\\u201d give a brief description of programming in its early years and how and why programmers are still struggling today...'

在这个字符串内部,您可以看到转义的 unicode 字符代码,例如:

\\u201c

我想把它变成:

\u201c

尝试1:

fetched_page.replace('\\\\', '\\')

但这不起作用——它搜索四倍反斜杠。

尝试2:

fetched_page.replace('\\', '\')

但这会导致行尾错误。

尝试 3:

fetched_page.decode('string_escape')

但这对文本没有影响。所有的双反斜杠仍然是双反斜杠。

4

6 回答 6

26

你可以试试codecs.escape_decode,这应该解码转义序列。

于 2011-07-19T19:06:59.457 回答
16

Python3:

>>> b'\\u201c'.decode('unicode_escape')
'“'

或者

>>> '\\u201c'.encode().decode('unicode_escape')
'“'
于 2019-04-28T09:49:58.090 回答
15

我没有得到你描述的行为:

>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\

当您'\\\\'在输出中看到时,您看到的斜杠是字符串中的两倍,因为每个 on 都被转义了。您编写的代码应该可以正常工作。尝试print实际值,而不是只查看 REPL 如何显示它们。

于 2011-07-19T18:53:10.563 回答
5

为了扩展杰里米的回答,您的问题是这'\'是一个非法字符串,因为它\'转义了引号,因此您的字符串永远不会终止。

于 2011-07-19T19:00:08.227 回答
3

这可能有点矫枉过正,但是...

>>> import re
>>> a = '\\u201c\\u3012'
>>> re.sub(r'\\u[0-9a-fA-F]{4}', lambda x:eval('"' + x.group() + '"'), a)
'“〒'

所以是的,最简单的解决方案是 ms4py 的回答,调用codecs.escape_decode字符串并获取结果(或者如果escape_decode返回一个元组,则结果的第一个元素,就像在 Python 3 中一样)。但是,在 Python 3 中,您希望codecs.unicode_escape_decode在处理字符串(而不是字节对象)时使用。

于 2011-07-19T19:17:24.657 回答
0

有趣的问题,但实际上,您只有一个斜线符号。这只是它在 python 中的一种表示方式。如果您列出字符串包含的符号列表?喜欢:

[s for s in string_object]

它显示每个符号并将“”表示为“\”,但您不必对此感到困惑。它实际上是单个符号。因此,在我的示例中,它不是双反斜杠。

真实例子:

>>> [s for s in 'usnDu\\NgAnA{I']
['u', 's', 'n', 'D', 'u', '\\', 'N', 'g', 'A', 'n', 'A', '{', 'I']
于 2020-12-03T11:30:42.680 回答