re.match 与 re.findall 的区别

23 投票
2 回答
18714 浏览
提问于 2025-04-18 08:35

为什么 re.match 会返回 None,而类似的 re.findall 却返回了一个非空的结果呢?

我正在解析电子邮件的主题。这里有一个主题:

subject = "=?UTF-8?B?0JLQsNGI0LUg0YHQvtC+0LHRidC10L3QuNC1INC90LUg0LTQvtGB0YLQsNCy0LvQtdC90L4=?=. Mail failure."

我想知道为什么

re.match("mail failure", subject, re.I) 会返回 None,而对应的

re.findall("mail failure", subject, re.I) 却返回了一个包含匹配字符串的列表 ['Mail failure']

我哪里想错了呢?

2 个回答

9

在这里的文档里可以找到相关信息:https://docs.python.org/2/library/re.html。你需要使用的是 re.search

需要注意的是,即使在多行模式下,re.match() 也只会在字符串的开头进行匹配,而不会在每一行的开头进行匹配。

33

re.match 是用来检查一个字符串开头是否符合某个模式的。而re.findall 则是用来在整个字符串中查找这个模式出现的地方。

比如说,如果你有一个模式 "mail failure" 和一个字符串:

subject = "=?UTF-8?B?0JLQsNGI0LUg0YHQvtC+0LHRidC10L3QuNC1INC90LUg0LTQvtGB0YLQsNCy0LvQtdC90L4=?=. Mail failure."

那么 re.match 会返回 None,因为这个字符串的开头并不是 "mail failure"。但是 re.findall 会找到这个模式,并返回匹配的结果,因为这个字符串里包含了 "mail failure"

撰写回答