【问题标题】:How do I catch "split" exceptions in python?如何在 python 中捕获“拆分”异常?
【发布时间】:2012-02-28 05:51:14
【问题描述】:

我正在尝试解析电子邮件地址列表以删除用户名和“@”符号,只留下域名。

例如:blahblah@gmail.com 所需输出:gmail.com

我用下面的代码完成了这个:

for row in cr: 
    emailaddy = row[0]
    (emailuser, domain) = row[0].split('@')
    print domain

但我的问题是当我遇到格式不正确的电子邮件地址时。例如,如果该行包含“aaaaaaaaa”(而不是有效的电子邮件地址),则程序会因错误而崩溃

(emailuser, domain) = row[0].split('@')
ValueError: need more than 1 value to unpack. 

(如您所料)与其检查所有电子邮件地址的有效性,我宁愿不更新获取域并继续下一条记录。如何正确处理此错误并继续前进?

所以对于列表:

blahblah@gmail.com
mmymymy@hotmail.com
youououou
nonononon@yahoo.com

我希望输出是:

gmail.com
hotmail.com

yahoo.com

谢谢!

【问题讨论】:

  • 请注意,验证电子邮件的唯一安全方法是将电子邮件发送到要求帐户持有人验证他们已收到电子邮件的地址。
  • 请注意,根据电子邮件规范,几个@ 是完全可以的。所以做rfind("@")之类的东西要明智得多..

标签: python


【解决方案1】:

你想要这样的东西吗?

try:
    (emailuser, domain) = row[0].split('@')
except ValueError:
    continue

【讨论】:

    【解决方案2】:

    你可以过滤掉不包含@的地址。

    >>> [mail.split('@')[1] for mail in mylist if '@' in mail]
    ['gmail.com', 'hotmail.com', 'yahoo.com']
    >>>
    

    【讨论】:

      【解决方案3】:

      怎么样

      splitaddr = row[0].split('@')
      if len(splitaddr) == 2:
          domain = splitaddr[1]
      else:
          domain = ''
      

      这甚至可以处理aaa@bbb@ccc 之类的情况并使其无效 ('')。

      【讨论】:

        【解决方案4】:

        试试这个

        In [28]: b = ['blahblah@gmail.com',
         'mmymymy@hotmail.com',
         'youououou',
         'nonononon@yahoo.com']
        
        In [29]: [x.split('@')[1] for x in b if '@' in x]
        Out[29]: ['gmail.com', 'hotmail.com', 'yahoo.com']
        

        【讨论】:

          【解决方案5】:

          这就是你想要的:

          import re
          
          l=["blahblah@gmail.com","mmymymy@hotmail.com",
             "youououou","nonononon@yahoo.com","amy@bong@youso.com"]
          
          for e in l:
              if '@' in e:
                 l2=e.split('@')
                 print l2[-1]
              else:
                 print
          

          输出:

          gmail.com
          hotmail.com
          
          yahoo.com
          youso.com
          

          它处理一封电子邮件可能有多个“@”的情况,并且只获取其中的 RH。

          【讨论】:

            【解决方案6】:
            if '@' in row[0]:
                user, domain = row[0].split('@')
                print domain
            

            【讨论】:

              【解决方案7】:

              我们可以将不带“@”符号的字符串视为简单的用户名:

              try:
                  (emailuser, domain) = row[0].split('@')
                  print "Email User" + emailuser
                  print "Email Domain" + domain
              except ValueError:
                  emailuser = row[0]
                  print "Email User Only" + emailuser
              
              O/P:
              Email User : abc
              Email Domain : gmail.com
              
              Email User : xyz
              Email Domain : gmail.com
              
              Email User Only : usernameonly
              

              【讨论】:

                【解决方案8】:

                也许最好的解决方案是一起避免异常处理。 您可以使用内置函数 partition() 来做到这一点。它类似于 split() 但在找不到分隔符时不会引发 ValueError 。
                阅读更多:
                https://docs.python.org/3/library/stdtypes.html#str.partition

                【讨论】:

                  猜你喜欢
                  • 2020-03-08
                  • 2021-06-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-06-15
                  相关资源
                  最近更新 更多