EMAIL id matcher-python正则表达式无法弄清楚

时间:2013-11-30 19:02:45

标签: python regex python-2.7

我正在尝试匹配username @ siteaddress形式的特定类型的电子邮件地址 其中username是非空字符串,最小长度为5,字符为{a-z A-Z 0-9。 _}。用户名无法从'。'开头。或'_'网站地址是前缀的构建,该前缀是从字符{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())

3 个答案:

答案 0 :(得分:2)

你不应该推出自己的电子邮件地址正则表达式 - 这是一个非常困难的事情,正确地做。有关该主题的讨论,请参阅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])+)
     \])

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

答案 1 :(得分:1)

您的问题与电子邮件匹配相关,而不是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

答案 2 :(得分:1)

\b[^\W_][\w.]{3,}[^\W_]@[^\W_]+\.(?:com|org|edu|co\.in)\b

Regular expression visualization