包含电子邮件但单词之间没有空格的文本。如何提取电子邮件

时间:2019-07-10 10:25:18

标签: python regex

我有一个仅包含电子邮件的文本,但之间没有空格 每封电子邮件

示例:email1@file1.comemail2@file1.comemail3@dom1.net

我申请了re.findall(r'[\w\.-]+@[\w\.-]+', str(line)),这就是我得到的

email1@file1.comemail
2@file1.comemail
3@dom1.net

受欢迎的顶级域名为.com.net.info.org。因此,如果我在@[\w\.-]+之后找到其中一个,那么我会在该行的tlds之后引起一个空格,然后提取电子邮件。

但是如何检查我有.com或.net或.info...。

2 个答案:

答案 0 :(得分:0)

一个选项(如果考虑到.com .net等很多变体,可能会变得非常麻烦)可能是使用非贪婪的+?匹配并列出所有您会选择的选项允许使用alternation

[\w.-]+?@[\w.-]+?\.(?:com|net)

Regex demo | Python demo

请注意,重复字符类[\w.-]+也将允许使用.-.-.@.-.-..com

例如

import re
s = "email1@file1.comemail2@file1.comemail3@dom1.net"
regex = r"[\w.-]+?@[\w.-]+?\.(?:com|net)"
res = re.findall(regex, s)
print(res)

结果

['email1@file1.com', 'email2@file1.com', 'email3@dom1.net']

答案 1 :(得分:0)

您可以使用re.sub()在每个tld之后添加空间。例如,我指定了.net.org.com,但是您可以根据需要添加任意数量。

然后您可以应用正则表达式

import re   
text = 'email1@file1.comemail2@file1.comemail3@dom1.net'
new_text = re.sub(r'(.com|.net|.org)', r'\1 ', text)
emails = re.findall(r'[\w\.-]+@[\w\.-]+', new_text)

输出

['email1@file1.com', 'email2@file1.com', 'email3@dom1.net']