【问题标题】:How to replace a double backslash with a single backslash in python?如何在python中用单个反斜杠替换双反斜杠?
【发布时间】:2011-07-19 18:51:30
【问题描述】:

我有一个字符串。在该字符串中是双反斜杠。我想把双反斜杠换成单反斜杠,这样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')

但这对文本没有影响。所有双反斜杠都保留为双反斜杠。

【问题讨论】:

  • 那些不是字符串中的双反斜杠,这就是为什么你不能摆脱它们 - 它只是显示字符串的工件。你的问题比你想象的要严重。
  • 你说得对——问题比我原先想象的要严重。我的解决方案涉及重新设计我提取数据的方式,以防止额外的反斜杠首先进入我的字符串(而不是在事后尝试将它们剥离)。
  • @zzz 这个问题你解决了吗?

标签: python escaping backslash


【解决方案1】:

Python3:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 但问题是“如何用单个反斜杠替换双反斜杠”而不是如何用双反斜杠替换四重反斜杠!
    【解决方案3】:

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

    【讨论】:

    • 另一种可能是'mystring'.decode('unicode_escape')
    • @ms_py:但在 Python 3 中不起作用;它必须是b'mybytes'.decode('unicode_escape')。不过,codecs.unicode_escape_decode 工作得很好。
    • 你怎么用这个?
    【解决方案4】:

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

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

    【讨论】:

    • 嗯,这似乎是一个不错的解决方案。但是,当我在 python 2.7.1 交互式终端上逐字运行它时,我得到的结果是 '\\u201c\\u3012' 而不是 '“〒'
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      有趣的问题,但实际上,您只有一个斜线符号。这只是它在 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']
      

      【讨论】:

        猜你喜欢
        • 2013-06-24
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        相关资源
        最近更新 更多