使用$进行Python正则表达式匹配

use*_*302 3 python

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

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

这不是我的预期.我虽然$会在结束前匹配,但它包含了两个结束字符和文本之后?

令人惊讶的是,这有效:

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

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

更多信息:

>>> re.search(r"//\s*.*", "//\n  test").group()
'//\n  test'
>>> re.search(r"//\s*.*", "//1\n  test").group()
'//1'
Run Code Online (Sandbox Code Playgroud)

最后一段代码没有MUTLILINE和DOTALL?我在这里误解了什么?.*不应该与换行符匹配,绝对不能过去吧,对吧?

And*_*ark 6

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

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

在第二种情况下\s*由于1之后的情况不能匹配//,并且.*?只会在第一个换行符之前匹配,因为它是懒惰的.

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