蟒蛇中的“r”re.compile(r'模式标志')是什么意思?

时间:2014-01-14 01:18:29

标签: python regex

我正在阅读http://docs.python.org/2/library/re.html。根据这个,蟒蛇re.compile中的“r”( r '模式标志')引用原始字符串表示法:

  

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

那么说:

是否公平

re.compile( r 模式)意味着“模式”是正则表达式,而re.compile(模式)意味着“模式”是完全匹配?

3 个答案:

答案 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>