我正在阅读http://docs.python.org/2/library/re.html。根据这个,蟒蛇re.compile中的“r”( r '模式标志')引用原始字符串表示法:
解决方案是使用Python的常规字符串表示法 表达模式;反斜杠不以任何特殊方式处理 带有'r'前缀的字符串文字。所以r“\ n”是一个双字符串 包含'\'和'n',而“\ n”是一个单字符的字符串 包含换行符。通常模式将用Python表示 使用此原始字符串表示法的代码。
那么说:
是否公平re.compile( r 模式)意味着“模式”是正则表达式,而re.compile(模式)意味着“模式”是完全匹配?
答案 0 :(得分:34)
正如@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它是一个原始字符串(r'\b'
)。
>>> 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
['', '']
答案 1 :(得分:7)
不,因为粘贴的文档解释了字符串的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"\\"
。
正如您可以猜测更长和更复杂的正则表达式,额外的斜杠可能会让人感到困惑,因此通常认为原始字符串是可行的。
答案 2 :(得分:2)
没有。并非正则表达式语法中的所有内容都需要以\
开头,因此.
,*
,+
等在模式中仍具有特殊含义
r''
通常用作正则表达式的便利,做需要大量\
,因为它可以防止将\
<加倍的混乱/ p>