【问题标题】:Python regex \number adding \0xPython正则表达式\数字添加\ 0x
【发布时间】:2012-05-18 17:44:45
【问题描述】:

我正在尝试对 python 中的字符串进行简单的正则表达式替换。这是我的代码:

>>> s = "num1 1 num2 5"
>>> re.sub("num1 (.*?) num2 (.*?)","1 \1 2 \2",s)

我希望得到这样的输出,\numbers 将被其对应的组替换。

'1 1 2 5'

但是,这是我得到的输出:

'1 \x01 2 \x025'

我有点困惑为什么\x0s 是他们的,而不是我想要的。非常感谢您的帮助

【问题讨论】:

  • 如果您只想要所有数字:' '.join(re.findall(r'\d+', 'num1 1 num2 5'))

标签: python regex replace


【解决方案1】:

你需要开始使用原始字符串(字符串前缀为 r):

>>> import re
>>> s = "num1 1 num2 5"
>>> re.sub(r"num1 (.*?) num2 (.*?)", r"1 \1 2 \2", s)
'1 1 2 5'

否则,您需要为 python 和正则表达式转义反斜杠,如下所示:

>>> re.sub("num1 (.*?) num2 (.*?)", "1 \\1 2 \\2", s)
'1 1 2 5'

(这真的很快,请查看python regex docs的开头段落

【讨论】:

  • +1。澄清一点:没有r\1\2 是八进制(base-8)字符转义,所以"1 \1 2 \2" 表示第三个字符是值为1 的ASCII 字符的字符串,并且其第七个字符是值为2 的ASCII 字符。这些字符不是打印字符,因此命令行漂亮打印机用十六进制字符转义符\x01\x02 替换它们。但\x0 不在实际字符串中,它只是在打印的内容中。
【解决方案2】:

\1\2 被解释为八进制字符代码转义,而不仅仅是传递给正则表达式引擎。使用原始字符串 r"\1" 而不是 "\1" 可以防止这种解释。

>>> "\17"
'\x0f'
>>> r"\17"
'\\17'

【讨论】:

    【解决方案3】:

    \1 正在字符串中进行解释。所以你必须用自己的反斜杠转义\

    >>> re.sub("num1 (.*?) num2 (.*?)", "1 \\1 2 \\2",s)
    '1 1 2 5'
    

    你也可以使用 raw 字符串:

    >>> re.sub("num1 (.*?) num2 (.*?)", r"1 \1 2 \2",s)
    '1 1 2 5'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 2014-05-24
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多