Zarkonnen 的回答确实回答了您的问题,但没有直接回答。让我试着更直接一些,看看我能不能从 Zarkonnen 那里抢到赏金。
如果您停止使用术语“原始字符串正则表达式”和“原始字符串模式”,您可能会发现这更容易理解。这些术语将两个独立的概念混为一谈:Python 源代码中特定字符串的表示形式,以及该字符串表示的正则表达式。
事实上,将它们视为两种不同的编程语言是有帮助的,每种语言都有自己的语法。 Python 语言有源代码,其中包括构建具有特定内容的字符串,并调用正则表达式系统。正则表达式系统具有驻留在字符串对象中并匹配字符串的源代码。两种语言都使用反斜杠作为转义字符。
首先,要了解字符串是一个字符序列(即字节或 Unicode 代码点;这里的区别并不重要)。在 Python 源代码中有多种表示字符串的方法。 原始字符串只是这些表示之一。如果两种表示产生相同的字符序列,它们会产生相同的行为。
想象一个 2 字符的字符串,由 反斜杠 字符后跟 n 字符组成。如果您知道 反斜杠 的字符值为 92,而 n 的字符值为 110,那么这个表达式将生成我们的字符串:
s = chr(92)+chr(110)
print len(s), s
2 \n
传统的 Python 字符串表示法 "\n" 不会生成此字符串。相反,它会生成一个带有换行符的单字符字符串。 Python docs 2.4.1. String literals 说,“反斜杠 (\) 字符用于转义具有特殊含义的字符,例如换行符、反斜杠本身或引号字符。”
s = "\n"
print len(s), s
1
(请注意,在这个例子中换行符是不可见的,但是如果你仔细看,你会在“1”之后看到一个空行。)
为了得到我们的两个字符的字符串,我们必须使用另一个反斜杠字符来转义原始反斜杠字符的特殊含义:
s = "\\n"
print len(s), s
2 \n
如果您想表示其中包含许多 反斜杠 字符的字符串怎么办? Python docs 2.4.1. String literals 继续,“字符串文字可以选择以字母 'r' 或 'R' 作为前缀;此类字符串称为 原始字符串,并使用不同的规则来解释反斜杠转义序列。”这是我们的两个字符的字符串,使用原始字符串表示:
s = r"\n"
print len(s), s
2 \n
所以我们有三种不同的字符串表示,都给出相同的字符串或字符序列:
print chr(92)+chr(110) == "\\n" == r"\n"
True
现在,让我们转向正则表达式。 Python docs, 7.2. re — Regular expression operations 说,“正则表达式使用反斜杠字符 ('\') 来表示特殊形式或允许使用特殊字符而不调用它们的特殊含义。这与 Python 出于相同目的使用相同字符相冲突字符串字面量..."
如果你想要一个匹配换行符的 Python 正则表达式对象,那么你需要一个 2 字符的字符串,由 反斜杠 字符后跟 n 字符组成.以下代码行都将 prog 设置为识别换行符的正则表达式对象:
prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")
那么为什么是"Usually patterns will be expressed in Python code using this raw string notation."?因为正则表达式通常是静态字符串,可以方便地表示为字符串文字。从可用的不同字符串文字符号中,当正则表达式包含 反斜杠 字符时,原始字符串是一个方便的选择。
问题
问:re.compile(r"\s\tWord")这个表达式呢? A:将字符串从正则表达式编译中分离出来,分别理解,更容易理解。
s = r"\s\tWord"
prog = re.compile(s)
字符串s包含八个字符:一个反斜杠、一个s、一个反斜杠、一个t,然后是四个字符 Word。
问:制表符和空格字符会怎样? A:在 Python 语言级别,字符串 s 没有 制表符 和 空格 字符。它以四个字符开头:反斜杠、s、反斜杠、t。同时,正则表达式系统将该字符串视为正则表达式语言中的源代码,这意味着“匹配一个由空格字符、制表符和四个字符Word组成的字符串。
问:如果这被视为 backlash-s 和 backslash-t,你如何匹配它们? A:如果“you”和“that”这两个词更具体,问题可能会更清楚:正则表达式系统如何匹配表达式 backlash-s 和 backslash-t?作为“任何空白字符”和“制表符字符”。
问:或者如果你有 3 个字符的字符串反斜杠换行符怎么办? A:在 Python 语言中,3 个字符的字符串 backslash-n-newline 可以表示为常规字符串"\\n\n",或原始加常规字符串r"\n" "\n",或其他方式。正则表达式系统在找到任意两个连续的 newline 字符时匹配 3 个字符的字符串 backslash-n-newline。
注意所有示例和文档引用均指向 Python 2.7。
更新:合并了@Vladislav Zorov 和@m.buettner 的回答以及@Aerovistae 的后续问题的澄清。