扎科宁的回答确实回答了你的问题,但不是直接回答。让我试着更直接一点,看看我是否能从扎科宁那里拿到赏金。
如果您停止使用术语“原始字符串正则表达式”和“原始字符串模式”,您可能会发现这更容易理解。这些术语合并了两个不同的概念:Python 源代码中特定字符串的表示形式,以及该字符串表示的正则表达式。
事实上,将它们视为两种不同的编程语言是有帮助的,每种语言都有自己的语法。 Python 语言的源代码除其他外还可以构建具有特定内容的字符串,并调用正则表达式系统。正则表达式系统的源代码驻留在字符串对象中,并匹配字符串。两种语言都使用反斜杠作为转义字符。
首先,了解字符串是字符序列(即字节或 Unicode 代码点;这里的区别并不重要)。 Python 源代码中有多种表示字符串的方法。 A原始字符串只是这些表示之一。如果两种表示产生相同的字符序列,则它们会产生相同的行为。
想象一个 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.字符串文字continue, “字符串文字可以选择以字母 '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 代码中表达。”?因为正则表达式通常是静态字符串,可以方便地表示为字符串文字。从可用的不同字符串文字表示法来看,当正则表达式包含反斜杠特点。
问题
Q: 表达方式怎么样re.compile(r"\s\tWord")
? A:把字符串和正则表达式编译分开,分别理解,这样更容易理解。
s = r"\s\tWord"
prog = re.compile(s)
字符串s
包含八个字符:a反斜杠, an s, a 反斜杠, a t,然后是四个字符Word
.
Q:制表符和空格字符会发生什么情况?A:在Python语言层面,字符串s
没有tab and space特点。它以四个字符开头:反斜杠, s, 反斜杠, t。同时,正则表达式系统将该字符串视为正则表达式语言中的源代码,其含义是“匹配由空格字符、制表符和四个字符组成的字符串”Word
.
Q:如果被视为反斜杠-s 和反斜杠-t,你如何匹配它们?A:如果“you”和“that”更加具体的话,也许问题会更清楚:正则表达式系统如何匹配表达式backlash-s和backslash-t?作为“任何空白字符”和“tab特点'。
Q:或者如果您有 3 个字符的字符串反斜杠-n-换行符怎么办?A:在Python语言中,3个字符的字符串反斜杠-n-换行符可以表示为常规字符串"\\n\n"
,或原始字符串加上常规字符串r"\n" "\n"
,或以其他方式。正则表达式系统在找到任意两个连续的时匹配 3 个字符的字符串反斜杠-n-换行符newline人物。
注意:所有示例和文档参考均针对 Python 2.7。
Update:合并了 @Vladislav Zorov 和 @m.buettner 的回答以及 @Aerovistae 的后续问题的澄清。