pythons re.compile(r' pattern flags') 中的“r”是啥意思?

Posted

技术标签:

【中文标题】pythons re.compile(r\' pattern flags\') 中的“r”是啥意思?【英文标题】:What does the "r" in pythons re.compile(r' pattern flags') mean?pythons re.compile(r' pattern flags') 中的“r”是什么意思? 【发布时间】:2014-02-01 23:27:15 【问题描述】:

我正在阅读http://docs.python.org/2/library/re.html。据此,pythons re.compile(r' pattern flags') 中的“r”指的是原始字符串表示法:

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

这样说是否公平:

re.compile(r pattern) 表示“pattern”是正则表达式,而 re.compile(pattern) 表示“pattern”是完全匹配的?

【问题讨论】:

rregexs 没有任何关系。它只是简化了模式的字符串声明。 下面已经有了很好的答案,但只是为了澄清一下:对于你最后一个问题的答案是 ,我将解释为 没有 re.compile @ 表示完全匹配? 【参考方案1】:

正如@PauloBu 所说,r 字符串前缀与正则表达式没有特别的关系,而是与 Python 中的字符串相关。

普通字符串使用反斜杠字符作为特殊字符(如换行符)的转义字符:

>>> print('this is \n a test')
this is 
 a test

r 前缀告诉解释器不要这样做:

>>> print(r'this is \n a test')
this is \n a test
>>> 

这在正则表达式中很重要,因为您需要反斜杠才能将其完整地传递给 re 模块 - 特别是,\b 专门匹配单词开头和结尾的空字符串。 re 需要字符串 \b,但是正常的字符串解释 '\b' 被转换为 ASCII 退格字符,因此您需要显式转义反斜杠 ('\\b'),或者告诉 python 它是原始字符串 (@ 987654332@).

>>> import re
>>> re.findall('\b', 'test') # the backslash gets consumed by the python string interpreter
[]
>>> re.findall('\\b', 'test') # backslash is explicitly escaped and is passed through to re module
['', '']
>>> re.findall(r'\b', 'test') # often this syntax is easier
['', '']

【讨论】:

\b 是退格键。 \a 是铃铛。 @user2357112 谢谢,我总是把它弄混 - 我会修复帖子 我喜欢你用一个例子来说明你的观点。【参考方案2】:

不,因为粘贴的文档解释了字符串的 r 前缀表示该字符串是 raw string.

由于 Python 转义字符和正则表达式转义之间存在冲突,两者都使用反斜杠 \ 字符,因此原始字符串提供了一种向 Python 指示您想要非转义字符串的方法。

检查以下内容:

>>> "\n"
'\n'
>>> r"\n"
'\\n'
>>> print "\n"


>>> print r"\n"
\n

r 为前缀仅表示反斜杠\ 应按字面意思处理,而不是python 的转义字符。

这很有帮助,例如当您在单词边界上进行搜索时。正则表达式是\b,但是要在Python 字符串中捕获它,我需要使用"\\b" 作为模式。相反,我可以使用原始字符串:r"\b" 进行模式匹配。

当试图在正则表达式中查找文字反斜杠时,这变得特别方便。为了匹配正则表达式中的反斜杠,我需要使用模式\\,要在python中转义它意味着我需要转义每个斜杠并且模式变为"\\\\",或者更简单的r"\\" .

正如您可以在更长和更复杂的正则表达式中猜到的那样,额外的斜杠会让人感到困惑,因此通常认为原始字符串是可行的方法。

【讨论】:

谢谢 - 非常有帮助 更好的答案,因为它实际上解释了 什么 r 代表 ;)【参考方案3】:

没有。并非正则表达式语法中的所有内容都需要以\ 开头,因此.*+ 等在模式中仍然具有特殊含义

r'' 通常用于方便正则表达式,确实需要大量 \,因为它可以防止将 \ 加倍的混乱

【讨论】:

以上是关于pythons re.compile(r' pattern flags') 中的“r”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

python xx=re.compile(r'“abc“,string1)里面r的作用是啥?

python之re模块

Python的re模块

python的strip_ge = re.compile(r"^ge(.4,)")怎么理解

python模块学习之re

python-re