我正在开发一个网络刮刀代码。我正在检索的基本内容是来自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)
答案 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)
参见演示。