如何从数据框中提取所有的电子邮件地址和电话号码?

3

我有一个包含电子邮件文本的数据框:

 id      e-mail
 1        text_1
 2        text_2
 3        text_3
 .          .
 .          .

与文本1(例如)一起:

"Gallag, Keit G" <Keit.Gallag@chart.com> 
Date: Friday, March 29, 2019 at 3:14 AM 
To: Lesl Kirch <ljkirch@action.com>
Subject: Automatic reply: News Recap, March 29, 2019 Issue of CrossTalk  

Thank you for your email. I will be out of the office Thursday, March 28th 
through Monday, April 1st. I will respond to emails on Tuesday, April 2nd. 
If this is urgent please contact lisa.chiap@chart.com or  for National 
Account question or Steph.thomp@chart.com or 309-557-1234 for 
National TeleSales 
inquiries.  
Thank you, Keith

我需要提取发件人的电子邮件地址(第一个电子邮件),电子邮件文本中的所有电子邮件地址和所有美国电话号码,并以以下方式呈现结果:

 id   email       sender_email                   mail              telephone
 1     text_1     Keit.Gallag@chart.com    ljkirch@action.com  309-557-1234
 1     text_1     Keit.Gallag@chart.com   lisa.chiap@chart.com  ?
 1     text_1     Keit.Gallag@chart.com   Steph.thomp@chart.com  ?
 2     text_2     e-mail_sender_2               e-mail_text_2_1           Tel_text_2_1
 2     text_2     e-mail_sender_2               e-mail_text_2_2           Tel_text_2_2 
 2     text_2     e-mail_sender_2                     ?                   Tel_text_2_3
 3     text_3     e-mail_sender_3               e-mail_text_3_1           Tel_text_3_1
 4     text_4     e-mail_sender_4               e-mail_text_4_1             ?
 .       .             .                             .                       .
 .       .             .                             .                                .

电子邮件中的电子邮件数量和美国电话号码的数量在电子邮件文本中会有所不同(在0和+inf之间)。

电话号码是否有一致的模式? - YusufUMS
这些是真实的电子邮件和电话号码吗?我非常确定Keith和Stephan不希望他们的姓名、电子邮件、公司和电话号码被发布在stackoverflow上。 - jprockbelly
@Yusufsn,这个模式是美国电话号码 - 即 xxx.xxx.xxxx 或者 xxx-xxx-xxxx。希望清楚明了。 - dkk
@jprockbelly。你说得对。我只是在这篇文章中修改了这些数据,以提供虚构的名称、邮件等。 - dkk
2个回答

4

使用正则表达式,如果你提供的电子邮件示例包含在数据框 ['Data_col'] 的一列中,则可以使用以下方法将4个电子邮件地址和电话号码提取到单独的列中:

df['Email_address']=df['Data_col'].str.findall('(\S+@\S+)')

然后,要将电子邮件地址分隔为单独的列,请使用:

df[['Email_address_1','Email_address_2','Email_address_3','Email_address_4']]=pd.DataFrame(df['Email_address'].values.tolist())

电话号码,请使用:

df['Phone_number']=df['Data_col'].str.extract('(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})')

希望这更有帮助。


谢谢您的回答,但是使用您的解决方案只能提取第一个电子邮件。我想要提取电子邮件正文中的所有电子邮件地址... - dkk

1

我不确定这是否是您正在寻找的内容。至少它能给您一个提示。

import re

info = []
for text in df["text"]:
    mail1 = re.findall("(\S+@\S+)",text)[:1]
    try:
        mail2 = re.findall("(\S+@\S+)",text)[1:]
        phone = re.findall("(\d{3}[\W]\d{3}[\W]\d{4})",text)
        mail1.insert(len(mail1),(", ".join(m for m in mail2)))
        mail1.insert(len(mail1),phone[0])
    except:
        pass
    info.append(mail1)

df[['Sender', 'Other_mails', 'Phone']] = pd.DataFrame(info)
df

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接