【问题标题】:Keeping domain of Email but removing TLD保留电子邮件域但删除 TLD
【发布时间】:2016-12-10 15:24:42
【问题描述】:

我正在使用 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()

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

【问题讨论】:

    标签: python pandas string-parsing


    【解决方案1】:

    如果你这样做

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

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

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

    在“random@gmail.com”上使用会得到“gmail”

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

    full = '@' + val
    

    【讨论】:

    • 你打字比我快。同样的想法。不知道为什么 pandas 是必要的,但这也有效
    • 是的,你的答案也有效,但接受了他的答案,因为它更符合我的需求,但如果他不提出,他会接受你的。不过谢谢!
    【解决方案2】:

    先拆分“@”,取“@”后面的部分。然后在“。”上拆分。并采取第一部分

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

    【讨论】:

    • 解决方案有效,但接受了@jezrael,因为他保留了@ 符号。不过谢谢,我意识到我可以更改 [1] 上的索引
    • @Kalimantan 我不是熊猫人。似乎它增加了复杂性。但是你的问题已经解决了。我添加到我的答案中
    【解决方案3】:

    使用熊猫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
    

    【讨论】:

    • john@arc.nasa.gov 或 rms@mail.york.ac.uk 会发生什么
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多