Zarkonnen的回答确实回答了您的问题,但没有直接回答。让我尝试更直接一些,看看我是否可以从扎尔肯恩那里获得赏金。
如果您停止使用术语“原始字符串正则表达式”和“原始字符串模式”,则可能会更容易理解。这些术语融合了两个独立的概念:Python源代码中特定字符串的表示形式,以及该字符串表示的正则表达式。
实际上,将它们视为两种不同的编程语言(每种都有自己的语法)会很有帮助。Python语言具有源代码,该源代码除其他外可以构建具有某些内容的字符串,并调用正则表达式系统。正则表达式系统具有驻留在字符串对象中并与字符串匹配的源代码。两种语言都使用反斜杠作为转义字符。
首先,了解字符串是一个字符序列(即字节或Unicode代码点;这里的区别并不重要)。有多种方法可以在Python源代码中表示字符串。一个原始字符串仅仅是这些表象之一。如果两个表示产生相同的字符序列,则它们会产生等效的行为。
想象一个2字符的字符串,由反斜杠字符和n字符组成。如果您知道反斜杠的字符值为92,n的字符值为110,则此表达式将生成我们的字符串:
s = chr(92)+chr(110)
print len(s), s
2 \n
常规的Python字符串表示法"\n"
不会生成此字符串。而是生成带有换行符的单字符字符串。在Python文档2.4.1。字符串文字说:“反斜杠(\)字符用于转义具有特殊含义的字符,例如换行符,反斜杠本身或引号字符。”
s = "\n"
print len(s), s
1
(请注意,在此示例中看不到换行符,但是如果仔细看,您会在“ 1”之后看到空白行。)
要获得两个字符的字符串,我们必须使用另一个反斜杠字符来转义原始反斜杠字符的特殊含义:
s = "\\n"
print len(s), s
2 \n
如果要表示其中包含许多反斜杠字符的字符串怎么办?Python文档2.4.1。字符串文字继续,“字符串文字可以选择以字母'r'或'R'开头;此类字符串称为原始字符串,并使用不同的规则来解释反斜杠转义序列。” 这是我们的两个字符的字符串,使用原始字符串表示形式:
s = r"\n"
print len(s), s
2 \n
因此,我们有三种不同的字符串表示形式,它们都给出相同的字符串或字符序列:
print chr(92)+chr(110) == "\\n" == r"\n"
True
现在,让我们来看一下正则表达式。在Python文档,7.2。re
—正则表达式操作说:“正则表达式使用反斜杠字符('\')表示特殊形式或允许使用特殊字符而无需调用特殊含义。这与Python在同一目的中出于相同目的使用同一字符相冲突。字符串文字...”
如果要与换行符匹配的Python正则表达式对象,则需要2个字符的字符串,该字符串由反斜杠字符和n字符组成。以下代码行均将prog设置为可识别换行符的正则表达式对象:
prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")
因此,为什么“通常使用这种原始字符串表示法在Python代码中表示模式”。?因为正则表达式通常是静态字符串,所以方便地表示为字符串文字。从正则表达式包含反斜杠字符时,原始字符串是一种方便的选择,从可用的不同字符串文字符号中选择。
问题
问:那表情re.compile(r"\s\tWord")
呢?答:通过将字符串与正则表达式编译分开,并分别理解它们,会更容易理解。
s = r"\s\tWord"
prog = re.compile(s)
该字符串s
包含八个字符:反斜杠,s,反斜杠,t和四个字符Word
。
问:制表符和空格字符会怎样?答:在Python语言级别,字符串s
没有制表符和空格字符。它从四个大字:反斜杠,小号,反斜杠,牛逼。同时,正则表达式系统将该字符串视为正则表达式语言中的源代码,其含义是“匹配由空格字符,制表符和四个字符组成的字符串Word
。
问:如果将其当作反斜杠和反斜杠t对待,您如何匹配它们?答:如果将“ you”和“ that”这两个词更具体地表达,问题可能会更清楚:正则表达式系统如何匹配表达式backlash-s和backslash-t?作为“任何空白字符”和“制表符”。
问:或者如果您有3个字符的字符串反斜杠-n-换行符,该怎么办?答:在Python语言中,可以将3个字符的字符串反斜杠-n-换行符表示为常规字符串"\\n\n"
,或原始加常规字符串r"\n" "\n"
或其他方式。当找到任何两个连续的换行符时,正则表达式系统将匹配3个字符的字符串反斜杠-n-换行符。
注意:所有示例和文档参考均针对Python 2.7。
更新:合并了@Vladislav Zorov和@ m.buettner的答案以及@Aerovistae的后续问题的说明。