在python中搜索模式为[at] /(at)的电子邮件地址

时间:2015-05-22 07:36:15

标签: python regex

我正在开发一个网络刮刀代码。我正在检索的基本内容是来自HTML源代码的电子邮件地址。我使用以下代码

 r = re.compile(r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b", re.IGNORECASE)
 emailAddresses =  r.findall(html) 

在少数网站中,电子邮件地址的格式为abcd [at] gmail.com/abcd(at)gmail.com。我需要一个通用的正则表达式代码,它将以abcd [at] gmail.com/abcd(at)gmail.com/abcd@gmail.com的三种格式之一检索电子邮件地址。我尝试了以下代码,但没有得到预期的结果。任何人都可以帮助我。

 r = re.compile(r"\b[A-Z0-9._%+-]+[@|(at)|[at]][A-Z0-9.-]+\.[A-Z]{2,6}\b", re.IGNORECASE)
     emailAddresses =  r.findall(html)

2 个答案:

答案 0 :(得分:6)

解决方案:将@替换为(@|\(at\)|\[at\])

r = re.compile(r"\b[A-Z0-9._%+-]+(@|\(at\)|\[at\])[A-Z0-9.-]+\.[A-Z]{2,6}\b", re.IGNORECASE)
emailAddresses =  r.findall(html) 

说明:在您的尝试中,您执行了[one|two|three],但您不能这样做。 […]用于单个字符或集合([a-z][abcd…xyz]相同)。您必须改为使用(one|two|three)。 [1]

此外,您尝试匹配()[]这些都是与REGEX相关的特殊字符,因此它们具有特殊功能。如果你想真正匹配它们(而不是使用它们的特殊功能),你必须记住先将\放在它们前面以逃避它们。同样适用于.?+*等。

建议:如果您愿意,也可以尝试以同样的方式匹配[dot](dot)

请记住,有很多方法可以混淆那里的电子邮件地址,包括一些您可能不知道的电子邮件地址。

而且,验证电子邮件地址(以及试图用REGEX捕获它们)也非常棘手:

实际官方REGEX为(?:[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])+)\])

编辑:来源: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html看起来它可能比上面的REGEX更差!!)

[1]请注意,使用(…)会捕获其内容,如果您希望不抓取此内容,则必须使用(?:…)

答案 1 :(得分:0)

 r = re.compile(r"\b[A-Z0-9._%+-]+(?:@|[(\[]at[\])])[A-Z0-9.-]+\.[A-Z]{2,6}\b", re.IGNORECASE)

                                  ^^^^^^^^^^^^^^^^^^  
 emailAddresses =  r.findall(html) 

参见演示。

https://regex101.com/r/nD5jY4/5#python