re.match 与 re.findall 的区别
为什么 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"
。