【问题标题】:What does 'r' mean before a Regex pattern?正则表达式模式之前的“r”是什么意思?
【发布时间】:2014-12-06 17:41:12
【问题描述】:

我从documentation 中找到了以下正则表达式替换示例,用于正则表达式。我有点困惑 r 在字符串之前的前缀是什么?

re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
 ...        r'static PyObject*\npy_\1(void)\n{',
 ...        'def myfunc():')

【问题讨论】:

    标签: python regex string syntax


    【解决方案1】:

    当前的re 模块文档解释了原始字符串的用法

    正则表达式使用反斜杠字符('\')表示 特殊形式或允许使用特殊字符而不 调用它们的特殊含义。这与 Python 的使用相冲突 字符串文字中用于相同目的的相同字符;为了 例如,要匹配文字反斜杠,可能必须编写 '\\\\' 作为模式字符串,因为正则表达式必须是\\,并且 每个反斜杠必须在常规 Python 字符串中表示为 \\ 文字。另外,请注意任何无效的转义序列 Python 在字符串文字中使用反斜杠现在会生成一个 DeprecationWarning,将来这将成为SyntaxError。 即使它是一个有效的转义序列,也会发生这种行为 正则表达式。

    解决方案是使用 Python 的原始字符串表示法 表达模式;反斜杠不以任何特殊方式处理 以'r' 为前缀的字符串文字。所以r"\n"是一个两个字符的字符串 包含'\''n',而"\n" 是一个字符的字符串 包含换行符。通常模式将用 Python 表示 使用此原始字符串表示法的代码。

    【讨论】:

      【解决方案2】:

      r 表示该字符串将被视为原始字符串,这意味着所有转义码都将被忽略。

      Python document 准确地说:

      字符串文字可以选择以字母“r”或“R”作为前缀;此类字符串称为原始字符串,并使用不同的规则来解释反斜杠转义序列。

      【讨论】:

        【解决方案3】:

        rR 放在字符串文字之前会创建所谓的raw-string 文字。原始字符串不处理转义序列(\n\b 等),因此通常用于包含大量 \ 字符的正则表达式模式。

        下面是一个演示:

        >>> print('\n') # Prints a newline character
        
        
        >>> print(r'\n') # Escape sequence is not processed
        \n
        >>> print('\b') # Prints a backspace character
        
        >>> print(r'\b') # Escape sequence is not processed
        \b
        >>>
        

        唯一的其他选择是将每个反斜杠加倍:

        re.sub('def\\s+([a-zA-Z_][a-zA-Z_0-9]*)\\s*\\(\\s*\\):',
         ...        'static PyObject*\\npy_\\1(void)\\n{',
         ...        'def myfunc():')
        

        这很乏味。

        【讨论】:

          猜你喜欢
          • 2015-07-21
          • 2021-08-02
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 2011-06-15
          • 2023-01-07
          • 2011-08-28
          • 1970-01-01
          相关资源
          最近更新 更多