使用正则表达式从字符串中提取所有电子邮件

时间:2018-06-09 00:09:20

标签: python regex python-3.x

我想从字符串中提取所有电子邮件。在这,我期待一个元组

(hello@gmail.com, aaaa@yahoo.com, no@yes.de, why@hotmail.com)

但是,我只收回了我的功能

中的第一封电子邮件
(hello@gmail.com)

发生了什么事?

import re

def getEmails(str):
    regex = r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+){0,}'
    obj = re.search(regex, str, re.M|re.I)
    return obj.groups()

str = "hello@gmail.com;aaaa@yahoo.com no@yes.de, why@hotmail.com"
print(getEmails(str))

2 个答案:

答案 0 :(得分:2)

在这种情况下,

re.search()不是您想要的功能。相反,您应该使用re.findall()

import re

def getEmails(str):
    regex = r'([\w0-9._-]+@[\w0-9._-]+\.[\w0-9_-]+)'
    return re.findall(regex, str, re.M|re.I)

str = "hello@gmail.com;aaaa@yahoo.com no@yes.de, why@hotmail.com"
print(getEmails(str))

Try it online!

我已将[A-Za-z]替换为[\w],因为它使正则表达式更容易阅读。我还删除了标记,因为它们不会被删除这个特殊的正则表达式所必需的。最重要的是,我已从正则表达式中删除了{0,}量词,因为您只想为每个可迭代项目发送一封电子邮件,而不是连续的电子邮件或空白项目。

它目前返回一个列表;如果你想让它成为一个元组,你可以将return语句改为return tuple(re.findall(regex, str, re.M|re.I))

我还会在结束时注意email address validation can be complicated

答案 1 :(得分:0)

@ jchi2241 ,您也可以使用re.finditer()来解决问题。

以下是代码(代码稍有变化):

  

在线尝试: http://rextester.com/BST18087

def getEmails(str):
    regex = r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+){0,}'
    emails = tuple(m.group(0) for m in re.finditer(regex, str) if m.group(0))
    return emails

str = "hello@gmail.com;aaaa@yahoo.com no@yes.de, why@hotmail.com"
print(getEmails(str))

输出»

('hello@gmail.com', 'aaaa@yahoo.com', 'no@yes.de', 'why@hotmail.com')