保留电子邮件域但删除 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'
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
似乎有点矫枉过正。
我正在使用 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'
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
似乎有点矫枉过正。