2016-08-04 210 views
2

我正在使用python,我希望能够保留电子邮件的域名,但删除'com','.co.uk'或'我们'等。保留电子邮件域名,但删除顶级域名

所以基本上如果我有一封电子邮件,说[email protected]。我希望只有@gmail保留字符串格式,但我想为任何电子邮件执行此操作。所以[email protected]会离开我@yahoo,或[email protected],会离开我与@aol

到目前为止我有:

domain = re.search("@[\w.]+", val) 
domain = domain.group() 

返回的域名,但与TLD 。因此@ gmail.com或@ aol.co

回答

1

随着大熊猫functions使用split

df = pd.DataFrame({'a':['[email protected]','[email protected]','[email protected]']}) 

print (df) 
        a 
0 [email protected] 
1  [email protected] 
2 [email protected] 

print ('@' + df.a.str.split('@').str[1].str.split('.', 1).str[0]) 
0 @yahoo 
1  @aol 
2  @aol 
Name: a, dtype: object 

但更快的是使用apply,如果在列不NaN值:

df = pd.concat([df]*10000).reset_index(drop=True) 

print ('@' + df.a.str.split('@').str[1].str.split('.', 1).str[0]) 
print (df.a.apply(lambda x: '@' + x.split('@')[1].split('.')[0])) 

In [363]: %timeit ('@' + df.a.str.split('@').str[1].str.split('.', 1).str[0]) 
10 loops, best of 3: 79.1 ms per loop 

In [364]: %timeit (df.a.apply(lambda x: '@' + x.split('@')[1].split('.')[0])) 
10 loops, best of 3: 27.7 ms per loop 

extract另一种解决方案比split更快,可以使用它,如果NaN值col UMN:

#not sure with all valid characters in email address 
print ('@' + df.a.str.extract(r"\@([A-Za-z0-9_]+)\.", expand=False)) 
In [365]: %timeit ('@' + df.a.str.extract(r"\@([A-Za-z0-9 _]+)\.", expand=False)) 
10 loops, best of 3: 39.7 ms per loop 
+0

谢谢这是我的问题的完美解决方案 – Kalimantan

+0

[email protected]c.nasa.gov或[email protected]会发生什么 –

2

如果您对您的电子邮件字符串变量名做

val = string.split('@')[1].split('.')[0] 

更改字符串 ''。

这将包含'@'符号后的所有内容,然后是第一个'。'。

使用上“[email protected]”给出的Gmail“

如果你需要“@”符号,你可以将其添加回来;

full = '@' + val 
+0

你输入的比我快。同样的想法。不知道为什么熊猫是必要的,但这也起作用 –

+0

是的,你的工作也接受了他的答案,因为它更符合我的需求,但如果他没有把他的话提出来,他会接受你的。虽然谢谢! – Kalimantan

2

先“@”分开,取“@”后的部分。然后分裂“。”并采取第一部分

email = "[email protected]" 
'@' + email.split("@")[1].split(".")[0] 
'@gmail' 
+0

解决方案奏效,但接受@jezrael,因为他保留@符号。不过谢谢,我意识到我可以改变[1] – Kalimantan

+0

@卡里曼丹的指数我不是熊猫人。它似乎增加了复杂性。但你的问题解决了。我添加到我的回答 –

0

为子孙后代和完整性,这也可以通过索引和切片做:

email = '[email protected]' 
at = email.index('@') 
dot = email.index('.', at) 
domain = email[at:dot] 

使用split()re似乎有点小题大做,当目标是提取单个子字符串。