【Python】正規表現でテキスト抽出~「ここから」「ここまで」テキスト抽出~

Python
田中太郎
田中太郎

正規表現を使って「ここから」「ここまで」テキストを抽出します

概要

テキストで開始となるキーワードから終了のキーワードまでを抽出します。

実行コマンド
./extract_text.py sample.txt "module +.*" "\)\;"

上記を実行すると、

sample.txt
module sample(
    input clk,
    input reset,
    input en,

    output logic o_data
);

always_ff @(posedge clk or negedge reset) begin
    if (!reset) begin
        o_data <= 1'b0;
    end else begin
        if (en) begin
            o_data <= 1'b1;
        end
    end
end
endmodule

上記のテキストから

    input clk,
    input reset,
    input en,

    output logic o_data

こんな感じで出力されます。

コード

extract_text.py
import argparse
import os
import re


def arg_parser():
    """Parser."""
    parser = argparse.ArgumentParser()
    parser.add_argument("input_path")
    parser.add_argument("start_keyword")
    parser.add_argument("end_keyword")
    return parser.parse_args()


def main(input_path, start_keyword, end_keyword):
    """Main."""
    with open(input_path, "r") as f:
        input_text = f.readlines()

    new_text = []
    start_keyword = re.compile(start_keyword)
    end_keyword = re.compile(end_keyword)
    start_flag = False
    end_flag = False

    for line in input_text:
        if re.search(end_keyword, line):
            end_flag = True
        if end_flag:
            break
        if start_flag:
            new_text.append(line)
        if re.search(start_keyword, line):
            start_flag = True

    for line in new_text:
        print(line, end="")


if __name__ == "__main__":
    arg = arg_parser()
    main(arg.input_path, arg.start_keyword, arg.end_keyword)

使い方

第1引数は抽出したいテキストファイルです。

第2引数は抽出開始になるキーワードです。

第3引数は抽出終了となるキーワードです。

第2、第3引数は正規表現に対応しています。

コードの解説

arg_parser
def arg_parser():
    """Parser."""
    parser = argparse.ArgumentParser()
    parser.add_argument("input_path")
    parser.add_argument("start_keyword")
    parser.add_argument("end_keyword")
    return parser.parse_args()

実行時に、テキストファイルと抽出開始キーワード、抽出終了キーワードを与えるためにパーサーを作っています。

main
def main(input_path, start_keyword, end_keyword):
    """Main."""
    with open(input_path, "r") as f:
        input_text = f.readlines()

    new_text = []
    start_keyword = re.compile(start_keyword)
    end_keyword = re.compile(end_keyword)
    start_flag = False
    end_flag = False

    for line in input_text:
        if re.search(end_keyword, line):
            end_flag = True
        if end_flag:
            break
        if start_flag:
            new_text.append(line)
        if re.search(start_keyword, line):
            start_flag = True

    for line in new_text:
        print(line, end="")

start_keyword = re.compile(start_keyword)

で文字列を正規表現対応の文字列に変換しています。

そして、

re.search(start_keyword, line)

でlineに入っている文字列にstart_keywordが含まれているかを探索しています。

まとめ

あるテキストファイルの「ここらか」「ここまで」抽出するスクリプトを作成しました。

ちなみに下記ではテキストファイルの「ここから」「ここまで」の文字列を抽出するするスクリプトです。

前者は行ごとに抽出しますが、後者は行の中から抽出します。

こちらも参考にしてみてください。

コメント

タイトルとURLをコピーしました