保留电子邮件域但删除 TLD

Keeping domain of Email but removing TLD

我正在使用 python,我希望能够保留电子邮件的域,但删除 'com'、“.co.uk”或 'us',等

所以基本上如果我有电子邮件,请说 random@gmail.com。我只想以字符串格式保留@gmail,但我想对任何电子邮件都这样做。所以 random@yahoo.com 会留给我 @yahoo,或者 random@aol.uk 会留给我 @aol

到目前为止我有:

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

那个 returns 域但带有 TLD 。所以@gmail.com,或者@aol.co

如果你这样做

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

为您的电子邮件字符串变量名称更改 'string'。

这将获取“@”符号之后的所有内容,然后是第一个“.”之前的所有内容

在 'random@gmail.com' 上使用得到 'gmail'

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

full = '@' + val

先拆分“@”,拆分“@”之后的部分。然后拆分为“。”并参加第一部分

email = "this.that@gmail.com.x.y"
'@' + email.split("@")[1].split(".")[0]
'@gmail'

与pandas functions use split:

df = pd.DataFrame({'a':['random@yahoo.com','random@aol.uk','random@aol.co.uk']})

print (df)
                  a
0  random@yahoo.com
1     random@aol.uk
2  random@aol.co.uk

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 列中的值可以使用它:

#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

为了后代和完整性,这也可以通过索引和切片来完成:

email = 'random@aol.co.uk'
at = email.index('@')
dot = email.index('.', at)
domain = email[at:dot]

当目标是提取单个子字符串时,使用 split()re 似乎有点矫枉过正。