Python 如何在字符串包含“-”的同时以“-”作为分隔符拆分列表?

Python 如何在字符串包含“-”的同时以“-”作为分隔符拆分列表?,python,split,Python,Split,我想拆分字符串以获取电子邮件,作为分隔符,但电子邮件和名称都包含-,我如何排除-,在电子邮件和名称中 下面是示例数据帧,第一行很好;第二排是jay-zee夫人的名字,jz@gmail.com是电子邮件;第三排,玛丽·爱丽丝是我的名字,妈妈-4ever@outlook.com是电子邮件 contact=['mr.wan-wan@yahoo.com-3918880000','mrs.jay-zee-jz@gmail.com-3800888899','mary-alice-ma-4ever@outlo

我想拆分字符串以获取电子邮件,作为分隔符,但电子邮件和名称都包含-,我如何排除-,在电子邮件和名称中

下面是示例数据帧,第一行很好;第二排是jay-zee夫人的名字,jz@gmail.com是电子邮件;第三排,玛丽·爱丽丝是我的名字,妈妈-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])

与其拆分并尝试合并回去,为什么不将终端-&数字替换为

不幸的是,由于电子邮件和名称中都可能存在-因此,仅通过查看字符串无法确定名称的结尾和电子邮件的开头

我的意思是,可以想象,有一个人名叫玛丽·爱丽丝·马,拥有这封电子邮件4ever@outlook.com而不是mary alice发电子邮件给ma-4ever@outlook.com

您最好的选择是手动处理在@之前包含2个或更多字符的联系人。但对于只有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
)

然后,对于生成的数据帧,编写更具体的代码来处理具有多个-的情况。

您可以使用正则表达式来执行此操作:

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]在a的左边,但在@的右边。

听起来像是你想要rsplit,或者更好的Rpartition你需要应用什么规则?例如,如果值为mrs.jay-zee-jz@gmail.com,你怎么知道它是jz@gmail.com而不是zee-jz@gmail.com? 这两个都是有效的电子邮件地址,大概jay夫人和jay-zee夫人都是有效的姓名。看起来您的数据可能无法正确解析。您好,没有规则。我知道是的jz@gmail.com就因为我知道。这是我的问题,我没有很好的方法来解析数据。。。这令人沮丧。请详细说明rsplit和R分区。谢谢你。你说得对,不可能确定姓名和电子邮件。我可以确定样本,因为我知道电子邮件和名称。用空间分隔是个好主意。非常感谢!在过去的30分钟里,我一直在学习正则表达式:这是我得到的,这不是我想要的。0万-wan@yahoo.com1 jay-zee-j-z@gmail.com2玛丽·爱丽丝·马-4ever@outlook.com
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)