2016-08-04 15 views
2

Ich benutze Python und ich möchte in der Lage sein, die Domain der E-Mail aber entfernen Sie die "com" oder ".co.uk", oder "uns" usw.Behalten Domain von E-Mail, aber Entfernen von TLD

Also im Grunde, wenn ich eine E-Mail habe, sagen Sie [email protected] Ich möchte nur @gmail im String-Format haben, aber ich möchte dies für jede E-Mail tun. So [email protected] verlassen würde mich mit @yahoo oder [email protected] würde mich verlassen mit @aol

so weit ich habe:

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

, dass die Domäne zurückgibt, aber mit der TLD . So @ gmail.com oder @ aol.co

Antwort

1

Mit Pandas functions Verwendung 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 

aber schneller verwenden apply, wenn in der Spalte sind nicht NaN Werte:

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 

Eine andere Lösung mit extract ist schneller als split, kann es verwendet werden, wenn NaN Werte in Spalte 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

Danke, das war die perfekte Lösung für mein Problem – Kalimantan

+0

Was passiert mit [email protected] oder [email protected] –

2

Wenn Sie

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

Change 'string' tun für Ihre E-Mail-String Variablennamen.

Dies wird alles nach dem '@' Symbol, dann alles bis zum ersten '.'

Verwendung auf ‚[email protected]‘ gibt ‚gmail‘

Wenn Sie benötigen das ‚@‘ Symbol, das Sie mit ihm wieder hinzufügen können;

full = '@' + val 
+0

Sie tippen schneller als ich. Gleiche Idee. Nicht sicher, warum Pandas nötig sind, aber das hat auch funktioniert. –

+0

Ja, das hat auch geklappt, aber er hat seine Antwort akzeptiert, weil es besser zu meinen Bedürfnissen passte, aber hätte deine akzeptiert, wenn er sie nicht hingelegt hätte. Trotzdem danke! – Kalimantan

2

Zuerst auf "@" teilen, den Teil nach "@" übernehmen. Dann auf "." und nehmen den ersten Teil

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

Die Lösung funktionierte, aber akzeptierte @jezrael, weil er das @ -Symbol behielt. Danke aber, und ich merke, dass ich den Index auf dem [1] – Kalimantan

+0

@Kalimantan einfach ändern kann, bin ich kein Pandas-Typ. Es scheint, dass es Komplexität hinzufügt. Aber dein Problem ist gelöst. Ich habe zu meiner Antwort hinzugefügt –

0

Für die Nachwelt und Vollständigkeit kann dies auch über Index und Scheibe erfolgen:

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

Mit split() und re scheint übertrieben, wenn das Ziel eine einzelne Unterkette zu extrahieren ist.