我想分割字符串以-
作为分隔符来获取电子邮件,但是电子邮件和名称都包含-
,如何在电子邮件和名称中排除-
?
下面是示例数据帧,第一行是正确的;第二行,mrs.jay-zee
是名称,jz@gmail.com
是电子邮件;第三行,mary-alice
是名称,ma-4ever@outlook.com
是电子邮件。
contact=['mr.wan-wan@yahoo.com-3918880000','mrs.jay-zee-jz@gmail.com-3800888899','mary-alice-ma-4ever@outlook.com-3600669966']
df=pd.DataFrame(contact,columns=['contacts'])
如果我使用以下lambda函数,则会得到错误的答案。实现目标的合适方法是什么?
df['contacts'].apply(lambda x: x.split('-')[1])
答案 0 :(得分:1)
您可以使用正则表达式执行此操作:
import re
VALID_EMAIL_REGEX = '\w+[-\w]+@\w+[\.\w]+'
emailaddr = lambda x: re.compile(VALID_EMAIL_REGEX).search(x).group(0)
df['contacts'].apply(emailaddr)
将对-
左侧的[a-zA-Z]
和@
进行任何组合,并且仅对.
和[a-zA-Z]
进行任意组合-
的左侧,但@
的右侧。
答案 1 :(得分:0)
而不是拆分并尝试合并,为什么不将终端-
和数字替换为''
df.contacts.str.replace('-\d+$', '')
outputs:
0 mr.wan-wan@yahoo.com
1 mrs.jay-zee-jz@gmail.com
2 mary-alice-ma-4ever@outlook.com
不幸的是,由于电子邮件和名称中都可以包含-
,因此仅通过查看字符串就无法确定名称的结尾和电子邮件的起始位置。
我的意思是,可以想象一个拥有电子邮件mary alice ma
的人名为4ever@outlook.com
而不是拥有电子邮件mary alice
的{{1}}
您最好的选择是手动处理ma-4ever@outlook.com
前两个或更多-
字符的联系人。但是对于只有1个@
的记录,可以安全地推断出-
将名称与电子邮件地址分开,并且只能使用以下命令为这些记录提取名称/电子邮件:
-
然后,针对生成的数据帧,编写更具体的代码以处理具有多个df['name_email'] = df.contacts.str.replace('-\d+$', '')
df['ambiguous'] = df.name_email.apply(lambda x: len(re.findall('-', x)) > 1)
df[['name', 'email']] = df.apply(
lambda x: pd.Series([None, None]) if x.ambiguous else pd.Series(x.name_email.split('-')),
axis=1
)
的情况。