この記事では、Pythonのre
(正規表現)モジュールとpyperclip
(クリップボード操作)モジュールを組み合わせて、クリップボードにコピーされたテキストから、電話番号とメールアドレスを自動で抽出し、整形して再びクリップボードに戻す実用的なツールを作成する方法を解説します。
1. 準備:必要なモジュール
このプログラムでは、正規表現を扱うre
モジュールと、クリップボードを操作するpyperclip
モジュールを使用します。pyperclip
はサードパーティ製のライブラリなので、事前にインストールが必要です。
pip install pyperclip
2. パターン定義:正規表現の作成
次に、抽出したい電話番号とメールアドレスのパターンを正規表現で定義します。ここではre.VERBOSE
フラグを使い、コメントを付けて可読性を高めます。
電話番号の正規表現
日本の電話番号は様々な形式(例: 090-1234-5678
, (03)1234-5678
, 0120-123-456
)がありますが、今回は市外局番や携帯電話番号の一般的な形式に対応するパターンを作成します。
import re
phone_regex = re.compile(r'''(
(\d{2,4}|\(\d{2,4}\))? # 市外局番 (例: 03, (090))。オプショナル
(\s|-|\.)? # 区切り文字 (スペース, -, .)。オプショナル
(\d{3,4}) # 加入者番号(前半)
(\s|-|\.) # 区切り文字
(\d{4}) # 加入者番号(後半)
)''', re.VERBOSE)
メールアドレスの正規表現
次に、一般的なメールアドレスの形式にマッチするパターンを定義します。
email_regex = re.compile(r'''(
[a-zA-Z0-9._%+-]+ # ユーザー名部分
@ # @マーク
[a-zA-Z0-9.-]+ # ドメイン名部分
(\.[a-zA-Z]{2,4}) # トップレベルドメイン (例: .com, .jp)
)''', re.VERBOSE)
3. プログラム本体の実装
正規表現の準備ができたら、クリップボードからテキストを取得し、パターンにマッチする部分をすべて探し出し、結果を整形して出力するメインの処理を記述します。
import pyperclip, re
# (ここに上記で定義したphone_regexとemail_regexを記述)
# 1. クリップボードからテキストを取得
text = str(pyperclip.paste())
# 2. マッチした結果を保存するリスト
matches = []
# 3. 電話番号を検索し、整形してリストに追加
for groups in phone_regex.findall(text):
phone_num = '-'.join([groups[1], groups[3], groups[5]])
# 市外局番の括弧などを除去
phone_num = phone_num.replace('(', '').replace(')', '')
matches.append(phone_num)
# 4. メールアドレスを検索し、リストに追加
for groups in email_regex.findall(text):
matches.append(groups[0])
# 5. 結果をクリップボードにコピーして出力
if len(matches) > 0:
# 重複を除去してからクリップボードにコピー
unique_matches = sorted(list(set(matches)))
pyperclip.copy('\n'.join(unique_matches))
print("クリップボードにコピーしました:")
print('\n'.join(unique_matches))
else:
print("電話番号やメールアドレスは見つかりませんでした。")
使い方とまとめ
このスクリプトを実行する前に、電話番号やメールアドレスが含まれたウェブサイトの文章などをクリップボードにコピーしておきます。その後、このPythonスクリプトを実行すると、ターミナルに抽出されたリストが表示され、同時にクリップボードの中身も整形されたリストで上書きされます。
このプログラムは、正規表現の強力なパターンマッチング能力と、pyperclip
によるOS連携を組み合わせることで、日常的なテキスト処理作業を大幅に効率化できる好例です。