-1

我使用以下代码在下载的页面上查找电子邮件:

page = urlfetch.Fetch(url = 'http://www.toyotabc.ru/vacancy/', deadline = 60)
if page.status_code == 200 and page.content:
    regexp = re.compile(
        r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"
        r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"'
        r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE)
    email = regexp.findall(page.content)
    if email:
        email = email[0]
        self.response.out.write('e-mail found: %s<br>' % (email))

但是,当代码中给出的示例页面上存在电子邮件时,它什么也不返回( emailis )。False我的代码有什么问题?

4

1 回答 1

3

我不知道你为什么从一个充满控制字符和其他东西的表达式开始,甚至不知道那个表达式应该是什么意思。也许如果你告诉我们你从哪里得到它,或者解释它,我们可以帮助你调试它。但除此之外,扔掉它并给你一个更简单的东西要简单得多。

您说您是从这个答案中获取的,但是该答案中的字符串比您给出的字符串长 29 个字符,因此显然您复制粘贴错误,或者事后以某种方式对其进行了修改。无论如何,根据问题,该正则表达式旨在针对域验证电子邮件地址,而不是查找所有电子邮件地址。它似乎也可以处理引用的(甚至可能是编码的?)名称。它以开头^和结尾的事实$清楚地表明它不能用于查找字符串中间的地址,而只能用于匹配整个字符串。所以,这不是你想要的。您不能只从一个问题中选择一个正则表达式,并希望它适用于一个模糊相关的问题,而不了解它在做什么。

您抱怨 RocketDonkey 不适用于带有点的电子邮件。这是真的,它也不处理地址中有效的其他一些字符。您可以阅读适当的 RFC,但在线快速搜索电子邮件地址的预制正则表达式要快得多。

您可能希望看到这个问题,其中包括指向完全符合 RFC-822 的正则表达式的链接,并解释了如何在需要时获得符合 RFC-5322 的正则表达式。

但是根据您的用途,您可能想要更简单的东西,可以对其进行调整以匹配无效但工作的地址,或不匹配有效但无用的地址,或匹配本机 Unicode 而不是 IDN 损坏的 Unicode,或…</p>

这是我在 Google 搜索中找到的第一个:

regexp=re.compile(r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}', re.IGNORECASE)

这是对的吗?乍一看,它似乎应该处理所有且仅使用 DNS 名称的有效电子邮件地址,但这并不是所有有效地址。也许您需要处理点 IP 邮件域或互联网前电子邮件地址,或者您希望在某些方面更宽松或在其他方面更严格,或其他任何方式。如果是这样,你必须解释你到底想要什么。但是您应该可以自己从这里开始:在您的测试用例上尝试一下,然后看看。如果它不正确,它很容易阅读,并且应该很容易修改。

于 2013-01-07T07:54:32.760 回答