[Python] 正規表現でマッチしたファイルを抽出する方法

Pythonで正規表現を使用してファイル名を抽出するには、reモジュールとosまたはglobモジュールを組み合わせて使用します。

まず、os.listdir()glob.glob()でディレクトリ内のファイルを取得し、次にre.match()re.search()を使って正規表現にマッチするファイルをフィルタリングします。

例えば、re.match(r'pattern', filename)でファイル名が特定のパターンに一致するかを確認できます。

この記事でわかること
  • 正規表現を使ったファイル名のマッチング方法
  • 特定の条件でファイルを抽出する技術
  • マッチしたファイルに対する操作手法
  • サブディレクトリ内のファイル検索方法
  • 大文字・小文字を無視したマッチング方法

目次から探す

正規表現でファイル名をマッチさせる方法

Pythonの正規表現モジュールreを使用することで、ファイル名のマッチングを簡単に行うことができます。

以下では、具体的なメソッドを使ったファイル名のマッチング方法を解説します。

re.match()を使ったファイル名のマッチング

re.match()は、文字列の先頭から正規表現にマッチするかどうかをチェックします。

ファイル名が特定のパターンで始まるかを確認するのに便利です。

import re
file_name = "report_2023.txt"
pattern = r"report_.*\.txt"
# ファイル名がパターンにマッチするか確認
if re.match(pattern, file_name):
    print("マッチしました!")
else:
    print("マッチしませんでした。")
マッチしました!

re.search()を使った部分一致のマッチング

re.search()は、文字列全体を対象に正規表現にマッチする部分を探します。

ファイル名の中に特定の文字列が含まれているかを確認するのに適しています。

import re
file_name = "summary_report_2023.pdf"
pattern = r"report"
# ファイル名にパターンが含まれているか確認
if re.search(pattern, file_name):
    print("部分一致しました!")
else:
    print("部分一致しませんでした。")
部分一致しました!

re.findall()で複数のパターンにマッチするファイルを抽出

re.findall()は、文字列の中から正規表現にマッチするすべての部分をリストとして返します。

複数のファイル名から特定のパターンにマッチするものを抽出するのに役立ちます。

import re
file_names = ["data_2023.csv", "report_2023.txt", "summary_2023.docx"]
pattern = r"2023"
# 2023が含まれるファイル名を抽出
matched_files = [name for name in file_names if re.findall(pattern, name)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['data_2023.csv', 'report_2023.txt', 'summary_2023.docx']

re.compile()で複数の正規表現を効率的に扱う

re.compile()を使用すると、正規表現パターンを事前にコンパイルしておくことができ、複数回使用する際に効率的です。

これにより、パフォーマンスが向上します。

import re
file_names = ["data_2023.csv", "report_2023.txt", "summary_2023.docx"]
pattern = re.compile(r"2023")
# 2023が含まれるファイル名を抽出
matched_files = [name for name in file_names if pattern.search(name)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['data_2023.csv', 'report_2023.txt', 'summary_2023.docx']

大文字・小文字を区別しないマッチング方法

正規表現で大文字・小文字を区別せずにマッチングを行うには、re.IGNORECASEフラグを使用します。

これにより、ファイル名の大文字小文字に関係なくマッチングが可能です。

import re
file_name = "Report_2023.TXT"
pattern = r"report"
# 大文字・小文字を区別せずにマッチング
if re.search(pattern, file_name, re.IGNORECASE):
    print("大文字・小文字を区別せずにマッチしました!")
else:
    print("マッチしませんでした。")
大文字・小文字を区別せずにマッチしました!

これらの方法を活用することで、Pythonを使ったファイル名のマッチングがより効率的に行えるようになります。

実践:特定のファイルを正規表現で抽出する

正規表現を使用することで、特定の条件に合ったファイルを効率的に抽出することができます。

以下では、具体的な例を挙げて解説します。

拡張子が特定の形式のファイルを抽出する

特定の拡張子を持つファイルを抽出するには、正規表現を使ってファイル名の末尾をチェックします。

例えば、.txt.csvのファイルを抽出する場合のコードは以下の通りです。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r".*\.(txt|csv)$"
# 指定した拡張子のファイルを抽出
matched_files = [f for f in os.listdir(directory) if re.match(pattern, f)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['data.csv', 'report.txt']

日付や番号が含まれるファイル名を抽出する

ファイル名に特定の日付や番号が含まれているかを確認するには、正規表現を使ってパターンを定義します。

以下は、YYYYMMDD形式の日付を含むファイル名を抽出する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r".*_\d{8}\..*$"  # 例: _20230101.txt
# 日付が含まれるファイルを抽出
matched_files = [f for f in os.listdir(directory) if re.match(pattern, f)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['report_20230101.txt', 'summary_20230101.csv']

特定の文字列を含むファイル名を抽出する

特定の文字列が含まれるファイル名を抽出するには、re.search()を使用します。

以下は、reportという文字列を含むファイル名を抽出する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r"report"
# 特定の文字列が含まれるファイルを抽出
matched_files = [f for f in os.listdir(directory) if re.search(pattern, f)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['report_2023.txt', 'summary_report.csv']

複数の条件にマッチするファイルを抽出する

複数の条件を組み合わせてファイルを抽出することも可能です。

例えば、reportという文字列を含み、かつ.txtまたは.csvの拡張子を持つファイルを抽出する場合のコードは以下の通りです。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r"report.*\.(txt|csv)$"
# 複数の条件にマッチするファイルを抽出
matched_files = [f for f in os.listdir(directory) if re.match(pattern, f)]
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['report_2023.txt']

サブディレクトリ内のファイルも含めて検索する

サブディレクトリ内のファイルも含めて検索するには、os.walk()を使用します。

以下は、指定したディレクトリとそのサブディレクトリ内のファイルを検索する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r".*\.txt$"
# サブディレクトリ内のファイルも含めて抽出
matched_files = []
for dirpath, dirnames, filenames in os.walk(directory):
    for f in filenames:
        if re.match(pattern, f):
            matched_files.append(os.path.join(dirpath, f))
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['./files/report.txt', './files/2023/report.txt']

これらの方法を活用することで、特定の条件に合ったファイルを効率的に抽出することができます。

正規表現を使うことで、柔軟な検索が可能になります。

応用例:正規表現を使ったファイル操作

正規表現を活用することで、ファイルの操作を効率的に行うことができます。

以下では、マッチしたファイルに対する具体的な操作例を紹介します。

マッチしたファイルを別のディレクトリに移動する

特定のパターンにマッチしたファイルを別のディレクトリに移動するには、shutilモジュールを使用します。

以下は、.txtファイルを./backupディレクトリに移動する例です。

import re
import os
import shutil
# 検索するディレクトリと移動先ディレクトリ
source_directory = "./files"
destination_directory = "./backup"
pattern = r".*\.txt$"
# 移動先ディレクトリが存在しない場合は作成
os.makedirs(destination_directory, exist_ok=True)
# マッチしたファイルを移動
for f in os.listdir(source_directory):
    if re.match(pattern, f):
        shutil.move(os.path.join(source_directory, f), os.path.join(destination_directory, f))
print("マッチしたファイルを移動しました。")
マッチしたファイルを移動しました。

マッチしたファイルをリネームする

マッチしたファイルの名前を変更するには、os.rename()を使用します。

以下は、reportという文字列を含むファイル名に_oldを追加する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r"report"
# マッチしたファイルをリネーム
for f in os.listdir(directory):
    if re.search(pattern, f):
        new_name = f.replace("report", "report_old")
        os.rename(os.path.join(directory, f), os.path.join(directory, new_name))
print("マッチしたファイルをリネームしました。")
マッチしたファイルをリネームしました。

マッチしたファイルを削除する

特定のパターンにマッチしたファイルを削除するには、os.remove()を使用します。

以下は、.tmp拡張子のファイルを削除する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r".*\.tmp$"
# マッチしたファイルを削除
for f in os.listdir(directory):
    if re.match(pattern, f):
        os.remove(os.path.join(directory, f))
print("マッチしたファイルを削除しました。")
マッチしたファイルを削除しました。

マッチしたファイルの内容を読み込んで処理する

マッチしたファイルの内容を読み込んで処理するには、ファイルを開いて内容を取得します。

以下は、.txtファイルの内容を読み込んで表示する例です。

import re
import os
# 検索するディレクトリ
directory = "./files"
pattern = r".*\.txt$"
# マッチしたファイルの内容を読み込んで処理
for f in os.listdir(directory):
    if re.match(pattern, f):
        with open(os.path.join(directory, f), 'r', encoding='utf-8') as file:
            content = file.read()
            print(f"{f}の内容:\n{content}\n")
report.txtの内容:
これはレポートの内容です。
summary.txtの内容:
これはサマリーの内容です。

複数のディレクトリからファイルを一括抽出する

複数のディレクトリから特定のパターンにマッチするファイルを一括で抽出するには、os.walk()を使用します。

以下は、./dir1./dir2から.csvファイルを抽出する例です。

import re
import os
# 検索するディレクトリ
directories = ["./dir1", "./dir2"]
pattern = r".*\.csv$"
# 複数のディレクトリからマッチしたファイルを抽出
matched_files = []
for directory in directories:
    for dirpath, dirnames, filenames in os.walk(directory):
        for f in filenames:
            if re.match(pattern, f):
                matched_files.append(os.path.join(dirpath, f))
print("マッチしたファイル名:", matched_files)
マッチしたファイル名: ['./dir1/data.csv', './dir2/report.csv']

これらの応用例を通じて、正規表現を使ったファイル操作がどのように行えるかを理解することができます。

正規表現を活用することで、ファイル管理がより効率的になります。

よくある質問

re.match()とre.search()の使い分けは?

re.match()re.search()は、どちらも正規表現を使って文字列を検索するための関数ですが、使用する場面が異なります。

  • re.match(): 文字列の先頭から正規表現にマッチするかどうかを確認します。

文字列の最初の部分がパターンに一致する場合のみマッチします。

  • re.search(): 文字列全体を対象に、正規表現にマッチする部分を探します。

文字列のどの位置にでもマッチする可能性があります。

例えば、re.match()"abc123"に対して"abc"というパターンでマッチしますが、"123abc"に対してはマッチしません。

一方、re.search()はどちらのケースでもマッチします。

正規表現で大文字・小文字を区別しない方法は?

正規表現で大文字・小文字を区別せずにマッチングを行うには、re.IGNORECASEフラグを使用します。

このフラグを指定することで、正規表現が大文字と小文字を区別せずにマッチングを行います。

以下は、re.search()を使用して大文字・小文字を区別せずにマッチする例です。

import re
text = "Hello World"
pattern = "hello"
# 大文字・小文字を区別せずにマッチング
if re.search(pattern, text, re.IGNORECASE):
    print("マッチしました!")
else:
    print("マッチしませんでした。")

このコードでは、"Hello World"に対して"hello"というパターンがマッチします。

サブディレクトリ内のファイルも検索するには?

サブディレクトリ内のファイルも含めて検索するには、os.walk()を使用します。

この関数は、指定したディレクトリ内のすべてのサブディレクトリを再帰的に探索し、ファイル名を取得することができます。

以下は、特定のパターンにマッチするファイルをサブディレクトリも含めて検索する例です。

import os
import re
directory = "./files"
pattern = r".*\.txt$"  # .txtファイルを検索
# サブディレクトリ内のファイルも含めて検索
matched_files = []
for dirpath, dirnames, filenames in os.walk(directory):
    for f in filenames:
        if re.match(pattern, f):
            matched_files.append(os.path.join(dirpath, f))
print("マッチしたファイル名:", matched_files)

このコードでは、指定したディレクトリとそのサブディレクトリ内のすべての.txtファイルを検索し、マッチしたファイル名をリストに追加します。

まとめ

この記事では、Pythonの正規表現を使用してファイル名をマッチさせる方法や、特定の条件に基づいてファイルを操作する実践的なテクニックについて解説しました。

正規表現を活用することで、ファイルの検索や管理がより効率的に行えることがわかります。

これを機に、実際のプロジェクトや日常のファイル管理に正規表現を取り入れて、作業の効率化を図ってみてはいかがでしょうか。

  • URLをコピーしました!
目次から探す