【问题标题】:Adding backslashes without escaping [duplicate]添加反斜杠而不转义[重复]
【发布时间】:2011-01-11 21:03:42
【问题描述】:

我需要转义字符串中的&(与号)字符。问题是每当我string = string.replace ('&', '\&') 结果是'\\&'。添加一个额外的反斜杠以转义原始反斜杠。如何删除这个多余的反斜杠?

【问题讨论】:

  • Knowing zilch about python: string = string.replace('&', '&') ...也许replace方法会为你避开那个&符号......呵呵
  • 如果你还在用SO,请标记解决方案!
  • @Veedrac:这个 4 年前的问题如何标记为 6 天前提出的问题的重复?
  • @User 因为骗子有一个公认的答案,可以说它更具描述性,并且比这个更好地解释了问题
  • Stack Overflow Chat 上决定新问题应该成为规范问题。因此,所有 else 都正式地被它欺骗了。如有不同意见请到Meta Stack Overflow讨论。

标签: python string replace escaping


【解决方案1】:

只显示结果'\\&'——实际上字符串是\&

>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&

在 shell 中尝试一下。

【讨论】:

  • 为什么没有标记为解决方案?
  • OP 需要文字字符串为'\&' 而不是'\\&'
【解决方案2】:

实际上并没有添加额外的反斜杠;它只是由repr() 函数添加以指示它是文字反斜杠。当需要打印表达式的结果时,Python 解释器使用 repr() 函数(在对象上调用 __repr__()):

>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'

【讨论】:

    【解决方案3】:

    Python 以特殊方式处理文字字符串中的\
    这样您就可以输入 '\n' 表示 newline 或输入 '\t' 表示 tab
    由于'\&' 对 Python 没有任何特殊意义,因此 Python 词法分析器不会导致错误,而是为您隐式添加额外的 \

    真的最好使用\\&r'\&' 而不是'\&'

    这里的r 表示原始字符串,表示\ 不会被特殊处理,除非它位于字符串开头的引号字符之前。

    在交互式控制台中,Python 使用repr 来显示结果,这就是你看到双“\”的原因。如果你 print 你的字符串或使用 len(string) 你会发现它实际上只有 2 个字符

    一些例子

    >>> 'Here\'s a backslash: \\'
    "Here's a backslash: \\"
    >>> print 'Here\'s a backslash: \\'
    Here's a backslash: \
    >>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
    'Here\'s a backslash: \\. Here\'s a double quote: ".'
    >>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
    Here's a backslash: \. Here's a double quote ".
    

    要澄清彼得在评论中提出的观点,请参阅this link

    与标准 C 不同,全部无法识别 转义序列留在 字符串不变,即反斜杠 留在字符串中。 (这种行为 在调试时很有用:如果转义 序列输入错误,结果 输出更容易被识别为 坏了。)同样重要的是要注意 将转义序列标记为 上表中的“(仅限 Unicode)” 属于无法识别的范畴 非 Unicode 字符串的转义 文字。

    【讨论】:

    • 部分内容不正确。 Python not “为你隐式添加了额外的``”。但是,当您显示字符串的 repr() 输出时,它确实会加倍反斜杠,就像在提示符处一样,纯粹是出于演示目的。 len("\&") 只是 2,证明您的数据没有隐式修改(感谢上帝!)。
    • @PeterHansen 我认为 OP 指出黑斜线通常应该在非原始字符串中转义,因此通常会写成双倍。
    【解决方案4】:
    >>> '\\&' == '\&'
    True
    >>> len('\\&')
    2
    >>> print('\\&')
    \&
    

    或者换句话说:'\\&' 只包含一个反斜杠。为了清楚起见,它只是在 python shell 的输出中转义。

    【讨论】:

      【解决方案5】:

      打印一个列表也会导致这个问题(我是python新手,所以我也有点困惑):

      >>>myList = ['\\']
      >>>print myList
      ['\\']
      >>>print ''.join(myList)
      \ 
      

      类似:

      >>>myList = ['\&']
      >>>print myList
      ['\\&']
      >>>print ''.join(myList)
      \&
      

      【讨论】:

        【解决方案6】:

        没有额外的反斜杠,它只是在交互式环境中以这种方式格式化。试试:

        print string
        

        然后你可以看到确实没有多余的反斜杠。

        【讨论】:

          猜你喜欢
          • 2020-02-01
          • 2016-06-30
          • 2015-12-02
          • 2017-05-12
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-30
          • 2012-11-04
          相关资源
          最近更新 更多