3

我正在使用 Python 2.7.0 并在解释器中执行以下操作:

>>> re.search (r"//\s*.*?$", "//\n\na12345678", flags=re.MULTILINE|re.DOTALL).group()
'//\n\na12345678'

这不是我所期望的。我虽然 $ 会在结束行之前匹配,但它包括两个结束行字符和之后的文本?

令人惊讶的是,这有效:

>>> re.search (r"//\s*.*?$", "//1\n\na12345678", flags=re.MULTILINE|re.DOTALL).group()
'//1'

我在这里对 python 正则表达式有什么误解?

更多信息:

>>> re.search(r"//\s*.*", "//\n  test").group()
'//\n  test'
>>> re.search(r"//\s*.*", "//1\n  test").group()
'//1'

最后一段代码没有 MUTLILINE 和 DOTALL?我在这里有什么误解?.* 不应该与换行符匹配,并且绝对不会超过它,对吗?

4

1 回答 1

6

\s可以匹配换行符,当你使用re.DOTALL标志.时也可以匹配换行符。

在第一种情况下,你\s*是贪婪的,所以由于//你的字符串中的第一个字符是换行符,它们将被匹配\s*,然后.*?将匹配最后一行,以便$可以在字符串的最后匹配。

在第二种情况下,由于 ,之后的\s*原因无法匹配,并且由于它是惰性的,因此只会匹配到第一个换行符之前。1//.*?

如果要匹配除换行符以外的所有空格,可以使用[ \t]. \s实际上,对于您的示例,如果您只使用启用//.*?$re.MULTILINE标志的正则表达式,您将获得预期的行为(re.DOTALL也可以包含在内,在这种情况下不会产生影响)。

于 2013-06-28T21:38:02.507 回答