電子メールの処理


第5部Gmailを用いた通知システムの実装についてLine Bot
今日、私は正規表現を見て、特定の内容のメールを検索するための一般的な機能を作ります.
前の記事で私はあなたに言及しました.
私は今すぐ私のユースケースに対処するために書いた一般的な機能をすぐに行くでしょう.最初に、基本的に同じことをした3つの異なった機能を書かなければならなかったので、私はこれをしました.
あまりにも多くの入力ミスを犯すのを防ぐために.正規表現を定数として格納します.
# Bus
BUS_DATA = (
    r"^「(?P<busname>[一-龯]\d{1,2})\s(?P<destination>[一-龯]+)行き・"
    "(?P<stop>[一-龯]+)」"
    )
注意事項[一-龯] 等しい[a-z] ここで我々は間の任意の単一の文字を受け入れるa and z . これは完璧ではありませんが、私が日本語で関係する必要があるすべての文字をカバーします.
はい、[一-龯]\d{1,2} . 東京のすべてのバス名は1つの完全な漢字と数字で構成されています.したがって、この正規表現は、1つの漢字が1または2桁であると一致すると言います.例:渋11 , 渋61これは括弧で囲まれています.キャプチャグループの作成.そしてこのグループは?P<name> ; 私たちに1つの完全なキャプチャを与える(?P<busname>[一-龯]\d{1,2}) .
他の2つのキャプチャグループを壊しましょう.
  • (?P<destination>[一-龯]+)行き これは1つ以上の漢字をキャプチャし、バスの最終目的地です.サービスを終了します.
  • (?P<stop>[一-龯]+) これは再び1つ以上の漢字をキャプチャし、それが搭乗されたバス停の名前です.
  • ジェネリック関数を見てみましょう.
    def findMatches(string, regex) -> dict:
        match = re.search(regex, string, re.UNICODE | re.MULTILINE)
        if match:
            matches = dict()
            for key in match.groupdict():
                matches[key] = match.group(key)
            return matches
        # No Matches
        return None
    
    これは何ですか.私たちはメールからのテキストの文字列を取っているし、複数行のテキストの1つの文字列です.我々はまた、正規表現を取っている.
    関数コールは次のようになります.
    matches = findMatches(body,BUS_DATA)
    
    遺体は'02月03日 18時15分\nNAME_OF_PASMO_USER\n「渋11\u3000田園調布駅行き・昭和女子大」でタッチしました。\n\n東急セキュリティ\n'まず、マッチオブジェクトを作成しますre.search() .
    我々はそれが複数行のテキストを取得し、そのテキストはASCIIではないという一致を伝える.
    正規表現を使ってマッチを見つけたら、辞書オブジェクトを作成します.
    その後、一致するオブジェクトのキー名を取得する(busname、宛先、停止).これらのキーを使用して値を取得するmatch.group(key) そして、これらの値を新しい辞書オブジェクトのキーに割り当てます.我々は最終的にそのオブジェクトを返します.
    しかし、試合がないチャンスがあります.だから私たちはNone その場合は、後でコードのテストを行うことができます.
    これはおそらく最良の解決策ではない.もちろん、辞書を作成せずにマッチオブジェクトを返すこともできます.