用于正则表达式的Python原始字符串表示法的单引号,双引号或三引号?

时间:2014-06-08 19:41:28

标签: python regex

我想知道何时使用Python的正则表达式的原始字符串表示法:单引号,双引号或三重双引号?

来自https://docs.python.org/2/howto/regex.html

  

当与三引号字符串一起使用时,这使RE的格式更加整齐:

pat = re.compile(r"""
 \s*                 # Skip leading whitespace
 (?P<header>[^:]+)   # Header name
 \s* :               # Whitespace, and a colon
 (?P<value>.*?)      # The header's value -- *? used to
                     # lose the following trailing whitespace
 \s*$                # Trailing whitespace to end-of-line
""", re.VERBOSE)

我用双引号和单引号替换了三重双引号,但都不起作用。

然而,该文章还使用单引号和其他示例中的双引号:

r"\w+\s+\1"

r'(\b\w+)\s+\1'

我想知道为什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

原始字符串的好处

使用原始字符串,您不必担心字符串中的反斜杠,如:

r"\d"

如果没有r,字符串将无法以您期望的状态到达引擎。你必须逃避反斜杠。

三重引号的好处

使用三引号(正如其他人所说)是你的字符串可以跨越多行,如:

r"""(?x)   # let's write this complex regex in free-space mode!
\d         # match a digit
$          # at the end of a line
"""

答案 1 :(得分:1)

三重引用示例演示了详细模式,其中从正则表达式中删除了空格,您可以使用空白来提高可读性。奇怪的是,这个例子没有提到关于详细的另一部分:它忽略了作为注释的#到行尾的所有内容。由于三引号保留了换行符,因此正则表达式会看到多行在其末尾有注释。

>>> print (r"""
...  \s*                 # Skip leading whitespace
...  (?P<header>[^:]+)   # Header name
...  \s* :               # Whitespace, and a colon
... ...
... """)

 \s*                 # Skip leading whitespace
 (?P<header>[^:]+)   # Header name
 \s* :               # Whitespace, and a colon
...

>>>

如果您只是使用一堆单引号来连接字符串,它只会看到一行有很长的注释。

>>> print (
... r" \s*                 # Skip leading whitespace"
... r" (?P<header>[^:]+)   # Header name"
... r" \s* :               # Whitespace, and a colon"
... r"...")
 \s*                 # Skip leading whitespace (?P<header>[^:]+)   # Header name \s* :               # Whitespace, and a colon...
>>>

您可以在每个字符串的末尾添加\ n以返回多行字符串。

至于单引号双引号,它只是个人偏好,对python或正则表达式无关紧要。如果引用的字符串包含“,那么”便于引用,反之亦然,就是这样。