【问题标题】:python regex get first part of an email addresspython 正则表达式获取电子邮件地址的第一部分
【发布时间】:2013-02-19 01:38:01
【问题描述】:

我对 python 和正则表达式很陌生,我想知道如何将电子邮件地址的第一部分提取到域名。例如,如果:

s='xjhgjg876896@domain.com'

我希望正则表达式的结果是(考虑到电子邮件 ID 的所有“种类”,即包括数字等):

xjhgjg876896

我得到了正则表达式的想法——因为我知道我需要扫描到“@”然后存储结果——但我不确定如何在 python 中实现它。

感谢您的宝贵时间。

【问题讨论】:

  • 您是否需要为此使用正则表达式(例如,作为家庭作业或其他内容的一部分)?还是您只是猜测没有其他方法可以做到这一点?
  • 如果您确实需要使用正则表达式,则必须阅读有关它们的教程以及 Python re 模块。如果我只是说“使用re.match('^(.*?)@', s)”,你不会知道如何使用返回的东西,如何调试或扩展它等等,那么你的重点是什么?
  • 您是否也想解析这些有效的电子邮件地址:Tony Snow <tony@example.com>(tony snow) tony@example.com?你想从tony%example.com@example.org 返回什么?电子邮件地址格式的当前标准在这里:rfc-editor.org/rfc/rfc5322.txt
  • 如果您需要解析完整的电子邮件地址,而不仅仅是这种简单的形式,您更肯定不想要正则表达式。请参阅 std 库和朋友中的email.utils.parseaddr,或者如果由于某种原因不合适,请在 PyPI 上搜索第三方库。正确处理所有细节非常困难。这正是 python 附带电池的原因。

标签: python regex


【解决方案1】:

您应该只使用字符串的split 方法:

s.split("@")[0]

【讨论】:

    【解决方案2】:

    正如其他人所指出的,更好的解决方案是使用split

    如果您真的热衷于使用 regex,那么这应该可以:

    import re
    
    regexStr = r'^([^@]+)@[^@]+$'
    emailStr = 'foo@bar.baz'
    matchobj = re.search(regexStr, emailStr)
    if not matchobj is None:
        print matchobj.group(1)
    else:
        print "Did not match"
    

    然后打印出来

    foo
    

    注意:这仅适用于SOMEONE@SOMETHING.TLD 的电子邮件字符串。如果要匹配NAME<SOMEONE@SOMETHING.TLD> 类型的电子邮件,则需要调整正则表达式。

    【讨论】:

      【解决方案3】:

      您不应使用正则表达式或split

      local, at, domain = 'john.smith@example.org'.rpartition('@')
      

      【讨论】:

        【解决方案4】:
        #!/usr/bin/python3.6
        
        
        def email_splitter(email):
            username = email.split('@')[0]
            domain = email.split('@')[1]
            domain_name = domain.split('.')[0]
            domain_type = domain.split('.')[1]
        
            print('Username : ', username)
            print('Domain   : ', domain_name)
            print('Type     : ', domain_type)
        
        
        email_splitter('foo.goo@bar.com')
        

        输出:

        Username :  foo.goo
        Domain   :  bar
        Type     :  com
        

        【讨论】:

        • foo.goo@here.domain.com 会失败
        【解决方案5】:

        这是另一种方式,使用索引方法。

        s='xjhgjg876896@domain.com'
        
        # Now lets find the location of the "@" sign
        index = s.index("@")
        
        # Next lets get the string starting from the begining up to the location of the "@" sign.
        s_id = s[:index]
        
        print(s_id)
        

        输出是

        xjhgjg876896
        

        【讨论】:

          【解决方案6】:

          需要安装包 pip install email_split

          from email_split import email_split
          email = email_split("ssss@ggh.com")
          print(email.domain)
          print(email.local)
          

          【讨论】:

            【解决方案7】:

            几个月前写了EmailExtractor.py。您可能想尝试一下并根据需要对其进行修改。它提取电子邮件地址。您可以使用“@”(推荐)拆分输出或修改正则表达式。

            【讨论】:

              【解决方案8】:

              下面应该可以帮助你做到这一点:

               fromAddr = message.get('From').split('@')[1].rstrip('>')
                      fromAddr = fromAddr.split(' ')[0]
              

              【讨论】:

                【解决方案9】:

                已经回答了很好的答案,但我还是想提出我的答案。

                • 如果我有一个电子邮件 john@gmail.com,我只想得到“john”。

                  我只想得到“约翰”

                • 如果我有一个电子邮件 john.joe@gmail.com,我只想得到“john”

                  我只想得到“约翰”

                这就是我所做的:

                name = recipient.split("@")[0]
                name = name.split(".")[0]
                print name
                

                干杯

                【讨论】:

                  【解决方案10】:

                  您也可以尝试使用 email_split。

                  from email_split import email_split
                  email = email_split('xjhgjg876896@domain.com')
                  email.local  # xjhgjg876896
                  email.domain  # domain.com
                  

                  您可以在https://pypi.org/project/email_split/ 找到更多信息。祝你好运:)

                  【讨论】:

                    【解决方案11】:

                    你可以找到邮件中的所有单词,然后返回第一个单词。

                    import re
                    def returnUserName(email):
                        return re.findall("\w*",email)[0]
                    
                    print(returnUserName("johns123.ss@google.com"))   #Output is - johns123
                    print(returnUserName('xjhgjg876896@domain.com'))  #Output is - xjhgjg876896
                    

                    【讨论】:

                      猜你喜欢
                      • 2020-07-14
                      • 2011-10-14
                      • 1970-01-01
                      • 2011-05-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多