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

use*_*629 24 python regex

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

解决方案是使用Python的原始字符串表示法来表示正则表达式模式; 在前缀为'r'的字符串文字中,不会以任何特殊方式处理反斜杠.所以r"\n"是包含'\'和'n'的双字符字符串,而"\n"是包含换行符的单字符字符串.通常,模式将使用此原始字符串表示法在Python代码中表示.

那么说:那样公平吗

re.compile(r pattern)意味着"pattern"是一个正则表达式,而re.compile(pattern)意味着"pattern"是完全匹配的?

Pet*_*son 38

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

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

>>> print 'this is \n a test'
this is 
 a test
Run Code Online (Sandbox Code Playgroud)

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

>>> print r'this is \n a test'
this is \n a test
>>> 
Run Code Online (Sandbox Code Playgroud)

这在正则表达式中很重要,因为您需要使用反斜杠来使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
['', '']
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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

检查以下内容:

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


>>> print r"\n"
\n
Run Code Online (Sandbox Code Playgroud)

使用一个r仅仅指示字符串的前缀\应该按字面意思处理反斜杠而不是python的转义字符.

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

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

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