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