我有一个字符串。在那个字符串是双反斜杠。我想用单个反斜杠替换双反斜杠,以便可以正确解析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')
但这对文本没有影响。所有双反斜杠仍然是双反斜杠。
你可以试试codecs.escape_decode
,这应该解码转义序列。
我没有得到你描述的行为:
>>> x = "\\\\\\\\"
>>> print x
\\\\
>>> y = x.replace('\\\\', '\\')
>>> print y
\\
当你在输出中看到'\\\\'
时,你看到的字符串数量是字符串中的两倍,因为每个字符都是转义的。你写的代码应该可以正常工作。尝试print
ing实际值,而不是仅查看REPL如何显示它们。
为了扩展Jeremy的答案,你的问题是'\'
是一个非法的字符串,因为\'
逃脱了引号,所以你的字符串永远不会终止。
它可能有点矫枉过正,但......
>>> 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
(而不是字节对象)。
Python3:
>>> b'\\u201c'.decode('unicode_escape')
'“'
要么
>>> '\\u201c'.encode().decode('unicode_escape')
'“'
只需打印它:
>>> a = '\\u201c'
>>> print a
\u201c