【问题标题】:EMAIL id matcher-python regular expression cant figure outEMAIL id matcher-python 正则表达式无法弄清楚
【发布时间】:2013-12-16 17:58:56
【问题描述】:

我正在尝试匹配格式为 username@siteaddress 的特定类型的电子邮件地址 其中用户名是从字符 {a-z A-Z 0-9 构建的最小长度为 5 的非空字符串。 _}.用户名不能从'.'开始或 ' _ ' 站点地址是由字符 {az AZ 0-9} (不包括括号)后跟以下后缀之一 {".com", ".org 的非空字符串构建的前缀的构建"、"edu"、".co.in"}。 以下代码不起作用

list=re.findall("[a-zA-Z0-9][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._]*@[a-zA-Z0-9][a-zA-Z0-9]*\.(com|edu|org|co\.in)",raw_input())

但是,当我在最后一个括号中添加“?:”时,以下工作正常,无法找出原因

list=re.findall("[a-zA-Z0-9][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._][a-zA-Z0-9._]*@[a-zA-Z0-9][a-zA-Z0-9]*\.(?:com|edu|org|co\.in)",raw_input())

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:
    \b[^\W_][\w.]{3,}[^\W_]@[^\W_]+\.(?:com|org|edu|co\.in)\b
    

    【讨论】:

      【解决方案2】:

      您的问题不是关于电子邮件匹配,而是关于findall 的行为,这取决于正则表达式是否包含捕获组。这是一个简单的例子:

      import re
      
      text = '123.com 456.edu 999.com'
      
      a = r'\d+\.(com|edu)'    # A capturing group.
      b = r'\d+\.(?:com|edu)'  # A non-capturing group.
      
      print re.findall(a, text)  # Only the captures: ['com', 'edu', 'com']
      print re.findall(b, text)  # The full matches: ['123.com', '456.edu', '999.com']
      

      快速浏览正则表达式documentation 可能对您来说是值得的。一些似乎与此处相关的项目:

      (?:...)  # Non-capturing group.
      ...{4,}  # Match something 4 or more times.
      \w       # Word character.
      \d       # Digit
      

      【讨论】:

        【解决方案3】:

        您不应该使用自己的电子邮件地址正则表达式 - 众所周知,要正确执行这是一件非常困难的事情。有关该主题的讨论,请参阅 http://www.regular-expressions.info/email.html

        总结那篇文章,这通常就足够了:\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

        这个更精确(作者声称 99.99% 的电子邮件地址):

        [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@
        (?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
        

        这是字面上匹配所有可能的RFC 5322 电子邮件地址的版本:

        (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
          |  "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
              |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
        @ (?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
          |  \[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
               (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:
                  (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
                  |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)
             \])
        

        最后一个显然是矫枉过正,但它让您了解所涉及的复杂性。

        【讨论】:

          猜你喜欢
          • 2013-02-14
          • 2021-05-18
          • 1970-01-01
          • 2015-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多