【Python】複数行のテキストから特定の文字列を含む行だけを抽出する方法

テキストデータ処理において、ログファイルやCSVデータなどの複数行テキストから、特定のキーワードが含まれる行のみを抜き出したい場面は多々あります。

Pythonでは、文字列の分割メソッドとリスト内包表記を組み合わせることで、この処理を非常に簡潔かつ高速に実装できます。ここでは、システムログから特定のエラーを含む行だけをフィルタリングして抽出するコード例を紹介します。

目次

文字列のフィルタリング処理

特定の文字列を含む行を抽出する手順は以下の通りです。

  1. 行への分割: 対象のテキストデータを改行コードで行ごとのリストに分解します。
  2. フィルタリング: リスト内包表記を使用し、条件に一致する行(特定の文字列を含む行)のみを抽出します。
  3. 再結合: 抽出された行のリストを、再び改行コードで結合して1つのテキストデータに戻します。

実装例:エラーログの抽出

以下のコードは、システムログを模したテキストデータから、[ERROR] という文字列が含まれる行のみを抽出する例です。

def main():
    # システムログを模したサンプルデータ
    log_data = """[INFO] 2023-10-01 10:00:00 System booted successfully.
[INFO] 2023-10-01 10:05:23 User 'admin' logged in.
[ERROR] 2023-10-01 10:15:00 Database connection failed.
[WARNING] 2023-10-01 10:20:00 High memory usage detected.
[ERROR] 2023-10-01 10:22:30 Critical exception in module X.
[INFO] 2023-10-01 10:30:00 Scheduled maintenance started."""

    # 1. 文字列を行ごとに分割する
    # splitlines()を使用すると、\nや\r\nなどの改行コードを自動的に処理して分割します
    lines = log_data.splitlines()

    # 2. "[ERROR]" を含む行だけをリスト内包表記で抽出する
    # lineの中にターゲット文字列が含まれているかを判定します
    target_keyword = "[ERROR]"
    error_lines = [line for line in lines if target_keyword in line]

    # 3. 抽出した行を改行コードで結合して新しい文字列を作成する
    filtered_log = "\n".join(error_lines)

    # 結果の出力
    print("--- 抽出されたエラーログ ---")
    print(filtered_log)

if __name__ == "__main__":
    main()

コードの解説

splitlines() メソッド 文字列を改行部分で区切り、リストとして返します。split('\n') と記述することも可能ですが、splitlines() は異なるOS間の改行コード(WindowsのCRLF、Unix系のLFなど)の違いを吸収してくれるため、より堅牢なコードになります。

リスト内包表記 [line for line in lines if target_keyword in line] の部分です。for ループを使って空のリストに append する従来の書き方と比較して、処理速度が速く、可読性も高くなります。

in 演算子 if target_keyword in line のように記述することで、文字列 line の中に target_keyword が含まれているかどうかを True / False で判定します。部分一致検索を簡単に行うための基本的な演算子です。

この手法はログ解析だけでなく、CSVデータの簡易的なフィルタリングや、特定の条件を満たす設定項目の抽出など、幅広い用途に応用可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次