【问题标题】: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】:
将r 或R 放在字符串文字之前会创建所谓的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():')
这很乏味。