我想从字符串中提取所有电子邮件。在这,我期待一个元组
(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))
答案 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))
我已将[A-Za-z]
替换为[\w]
,因为它使正则表达式更容易阅读。我还删除了标记,因为它们不会被删除这个特殊的正则表达式所必需的。最重要的是,我已从正则表达式中删除了{0,}
量词,因为您只想为每个可迭代项目发送一封电子邮件,而不是连续的电子邮件或空白项目。
它目前返回一个列表;如果你想让它成为一个元组,你可以将return语句改为return tuple(re.findall(regex, str, re.M|re.I))
答案 1 :(得分:0)
@ jchi2241 ,您也可以使用re.finditer()
来解决问题。
以下是代码(代码稍有变化):
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')