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”是完全匹配的?
【问题讨论】:
r
与regex
s 没有任何关系。它只是简化了模式的字符串声明。
下面已经有了很好的答案,但只是为了澄清一下:对于你最后一个问题的答案是 否,我将解释为 没有 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的作用是啥?