我正在尝试匹配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())
答案 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