我正在使用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?我在这里误解了什么? 。*不应该与换行符匹配,绝对不能过去,对吧?
答案 0 :(得分:6)
\s
可以匹配换行符,当您使用re.DOTALL
标记时,.
也可以匹配换行符。
在第一种情况下,\s*
是贪婪的,因为字符串中//
之后的第一个字符是换行符,它们将由\s*
匹配,然后.*?
匹配1}}将匹配最后一行,以便$
可以匹配字符串的最后一行。
在第二种情况下\s*
因1
之后的//
而无法匹配,而.*?
只会在第一个换行符之前匹配,因为它懒惰。
如果要匹配除换行符之外的所有空格,可以使用[ \t]
代替\s
。实际上,对于您的示例,如果您只使用带有//.*?$
标记的正则表达式re.MULTILINE
,您将获得预期的行为(re.DOTALL
也可以包含在内,它不会成为在这种情况下的差异)。