保持电子邮件域名但删除TLD

时间:2016-08-04 13:16:50

标签: python pandas string-parsing

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

所以基本上如果我有一封电子邮件,请说random@gmail.com。我希望只有@gmail以字符串格式保留,但我想为任何电子邮件执行此操作。所以random@yahoo.com会留下我@yahoo,或者random@aol.uk,会留给我@aol

到目前为止,我有:

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

返回域但使用TLD。所以@ gmail.com,或@ aol.co

4 个答案:

答案 0 :(得分:3)

如果你这样做

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

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

这将取决于' @'符号,然后是第一个'。'

的所有内容

使用on' random@gmail.com'给出了' gmail'

如果您需要' @'您可以将其添加回来的符号;

full = '@' + val

答案 1 :(得分:2)

首先拆分" @",在" @"之后取出部分。然后拆分"。"并采取第一部分

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

答案 2 :(得分:1)

使用panda functions使用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

答案 3 :(得分:0)

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

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

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