Python | 正規表現(re)

Python
スポンサーリンク

では、先ほどのCSV出力スクリプトをさらに pandasで分析・集計・件数カウント・重複削除 まで対応する実務向けスクリプトに拡張します。


# =============================================
# 実務向け:抽出→CSV出力→pandasで集計・件数カウント
# =============================================
import re
import os
import csv
import pandas as pd

# -----------------------------
# 1. 抽出するパターン(正規表現)
# -----------------------------
email_pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
phone_pattern = r"\b0\d{1,4}-\d{1,4}-\d{4}\b"
date_pattern  = r"\b\d{4}-\d{2}-\d{2}\b"

# -----------------------------
# 2. 対象フォルダと出力CSV
# -----------------------------
input_folder = "./texts"  # テキストファイルが入っているフォルダ
output_csv   = "extracted_data_rows.csv"

# -----------------------------
# 3. ファイルを読み込み抽出
# -----------------------------
results = []

for filename in os.listdir(input_folder):
    if filename.endswith(".txt"):
        file_path = os.path.join(input_folder, filename)
        with open(file_path, "r", encoding="utf-8") as f:
            text = f.read()
        
        emails = re.findall(email_pattern, text)
        phones = re.findall(phone_pattern, text)
        dates  = re.findall(date_pattern, text)

        for e in emails:
            results.append({"ファイル名": filename, "タイプ": "メール", "値": e})
        for p in phones:
            results.append({"ファイル名": filename, "タイプ": "電話", "値": p})
        for d in dates:
            results.append({"ファイル名": filename, "タイプ": "日付", "値": d})

# -----------------------------
# 4. CSV に出力
# -----------------------------
fieldnames = ["ファイル名", "タイプ", "値"]

with open(output_csv, "w", newline="", encoding="utf-8") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for row in results:
        writer.writerow(row)

print(f"抽出結果を {output_csv} に出力しました。")

# -----------------------------
# 5. pandasで集計・分析
# -----------------------------
df = pd.read_csv(output_csv)

# (1) 件数カウント
count_summary = df.groupby("タイプ").size().reset_index(name="件数")
print("\n--- 件数カウント ---")
print(count_summary)

# (2) ファイルごとの件数
file_summary = df.groupby(["ファイル名", "タイプ"]).size().reset_index(name="件数")
print("\n--- ファイルごとの件数 ---")
print(file_summary)

# (3) 重複削除
df_unique = df.drop_duplicates(subset=["タイプ", "値"])
print("\n--- 重複削除後のデータ ---")
print(df_unique)

# (4) 集計結果をCSV保存(必要なら)
df_unique.to_csv("extracted_data_unique.csv", index=False, encoding="utf-8")
print("\n重複削除後のデータを 'extracted_data_unique.csv' に保存しました。")
Python

このスクリプトの特徴

  1. 1件ごとに1行で抽出 → タイプ 列で種類が明確
  2. pandasで件数カウント → タイプ別・ファイル別に集計
  3. 重複削除 → 同じメール・電話・日付が複数あっても1件に整理
  4. 集計結果CSV出力 → 分析や報告書作成に便利
  5. 初心者でも理解しやすいコメントつき

💡 応用例

  • メールドメインごとの件数集計
  • 日付ごとの件数推移グラフ(matplotlib で可視化)
  • 電話番号の市外局番ごとの集計
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました