-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文字長いので、どうやらあなたはそれを間違ってコピーペーストしたか、何らかの方法で事後に修正しました。いずれにせよ、質問によると、その正規表現は、すべての電子メールアドレスを見つけるのではなく、ドメインに対して電子メールアドレスを検証することを目的としています。また、引用符で囲まれた(おそらくエンコードされた)名前も処理するようです。それが文字列の途中でアドレスを見つけるために使用することはできず、文字列全体に一致するためにのみ使用できることを明確に示しています^$だから、それはあなたが望むものではありません。1つの問題から正規表現を取得して、それが何をしているのかを理解せずに、漠然と関連する問題に対して機能することを期待することはできません。

RocketDonkeyは、ドットが含まれている電子メールでは機能しないと不満を漏らしました。それは真実であり、アドレスで有効な他のいくつかの文字も処理しません。適切なRFCを読むこともできますが、電子メールアドレスの事前に作成された正規表現をオンラインですばやく検索する方がはるかに高速です。

この質問は、RFC-822に完全に準拠した正規表現へのリンクが含まれており、必要に応じてRFC-5322に準拠した正規表現を取得する方法を説明しています。

ただし、用途によっては、より単純なものが必要になる場合があります。これは、有効ではないが機能しているアドレスと一致するか、有効であるが役に立たないアドレスと一致しないか、IDNがマングルされたUnicodeの代わりにnative-Unicodeと一致するように調整できます。 …</p>

これが私がグーグル検索で見つけた最初のものです:

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

それが正しいか?一見すると、DNS名を使用するすべての有効な電子メールアドレスのみを処理する必要があるように見えますが、それがすべての有効なアドレスではありません。ドット付きIPメールドメインやインターネット以前の電子メールアドレスを処理する必要があるかもしれません。あるいは、ある意味で緩くしたり、他の方法で厳密にしたりする必要があるかもしれません。もしそうなら、あなたはあなたが何を望んでいるかを正確に説明しなければならないでしょう。しかし、あなたはここから自分で行くことができるはずです:あなたのテストケースでそれを試してみてください。正しくない場合は、読みやすく、変更しやすいはずです。

于 2013-01-07T07:54:32.760 に答える