2016-08-04 111 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似乎有點小題大做,當目標是提取單個子字符串。