萬九郎の硬い船

プログラミング学習記録など

pyperclipを使ったクリップボード内のメアド検索:@が[at]などに置き換えられている場合について

『退屈なことはPythonにやらせよう』の7章に、クリップボード内のテキストから(電話番号や)メアドを検索して抜き出す方法というのが載っていた。 サイト上に載っているメアドはスパム避けのために@が[at]などに置き換えられていることも多いので、そういった場合に少しでもメアドを取りこぼさないプログラムにするために、練習がてら自分で改良を加えてみた。

import pyperclip, re

email_regex = re.compile(r'''(
    [a-zA-Z0-9._%+-]+  # ユーザー名
    (@|[[(_]+at[])_]+) # 隠蔽工作を含む@マーク
    [a-zA-Z0-9.-]+     # ドメイン名
    (\.[a-zA-Z]{2,4})  # ドット〜
)''', re.VERBOSE)

text = str(pyperclip.paste())
alt_atmark_regex = re.compile(r'[[(_]+at[])_]+')
matches = []

for groups in email_regex.findall(text):
    matches.append(alt_atmark_regex.sub('@', groups[0]))

if len(matches) > 0:
    pyperclip.copy('\n'.join(matches))
    print('クリップボードにコピーしました:')
    print('\n'.join(matches))
else:
    print('メールアドレスは見つかりませんでした。')

上記のうち、検索する際の正規表現

    (@|[[(_]+at[])_]+) # 隠蔽工作を含む@マーク

として、@が括弧やアンダーバーで「at」を囲んだもので置き換えられている場合もヒットするようにしたのと、 matchesリストに追加する際に

alt_atmark_regex = re.compile(r'[[(_]+at[])_]+')
matches = []

for groups in email_regex.findall(text):
    matches.append(alt_atmark_regex.sub('@', groups[0]))

として、括弧やアンダーバーで「at」を囲んだものを@に置き換え直すようにした。