【Python】文字列抽出~テキストの「ここから」「ここまで」抽出する~

Python
田中太郎
田中太郎

pythonで文字列抽出のサンプルコードを紹介します

機能概要

テキストファイルからあるキーワードに挟まれた文字列を抽出します。

例)以下のようなテキストファイルがあるとします。

sample.txt
logic sig1;
logic sig2;
logic sig3;
logic sig4;
logic sig5;
logic sig6;

このテキストの「logic」から[;]の間の文字のみを取り出したいとき、

実行
./extract_string.py sample.txt "logic" ";"

このように打つと、

sig1
sig2
sig3
sig4
sig5
sig5

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

サンプルコード

extract_string.py
"""extract_string."""
import argparse
import re


def arg_parser():
    """Parser."""
    parser = argparse.ArgumentParser(description="hoge")
    parser.add_argument("input_path")
    parser.add_argument("left_str")
    parser.add_argument("right_str")
    parser.add_argument("-r", "--right", action="store_true")
    return parser.parse_args()


def search_right(text, left_str, right_str):
    new_text = []
    for line in text:
        if line.rfind(right_str) != -1:
            if line.rfind(left_str) != -1:
                new_text.append(
                        line[line.rfind(left_str)+len(left_str):line.rfind(right_str)])
            else:
                new_text.append(line[:line.find(right_str)])
    return new_text


def search_left(text, left_str, right_str):
    new_text = []
    for line in text:
        if line.find(left_str) != -1:
            if line.find(right_str) != -1:
                new_text.append(
                        line[line.find(left_str)+len(left_str):line.find(right_str)])
            else:
                new_text.append(line[line.rfind(left_str)+len(left_str):])
    return new_text


if __name__ == "__main__":
    arg = arg_parser()
    with open(arg.input_path, "r") as f:
        text = f.readlines()
    if arg.right:
        line = search_right(text, arg.left_str, arg.right_str)
    else:
        line = search_left(text, arg.left_str, arg.right_str)

    for i in line:
        print(i)

使い方

コマンドラインで

第1引数:テキストファイルのパス

第2引数:「こっから」

第3引数:「ここまで」

第4引数:オプションで-rを付けると右から検索(デフォルトで左からキーワードを探す)

解説

arg_parser
def arg_parser():
    """Parser."""
    parser = argparse.ArgumentParser(description="hoge")
    parser.add_argument("input_path")
    parser.add_argument("left_str")
    parser.add_argument("right_str")
    parser.add_argument("-r", "--right", action="store_true")
    return parser.parse_args()

パーサーを作っています。

必ず必要な引数は3つで、テキストファイルのパス、抽出開始キーワード、抽出終了キーワードです。

オプションで-rを付けるとキーワードを文章の右から検索します。

search_right
def search_right(text, left_str, right_str):
    new_text = []
    for line in text:
        if line.rfind(right_str) != -1:
            if line.rfind(left_str) != -1:
                new_text.append(
                        line[line.rfind(left_str)+len(left_str):line.rfind(right_str)])
            else:
                new_text.append(line[:line.find(right_str)])
    return new_text

キーワードを文章の右から検索して、文字列を抽出する。

抽出終了キーワードをまず見つけて、抽出開始キーワードが見つからなかったら、その段落も先頭から抽出終了キーワードまでを抽出する。

search_left
def search_left(text, left_str, right_str):
    new_text = []
    for line in text:
        if line.find(left_str) != -1:
            if line.find(right_str) != -1:
                new_text.append(
                        line[line.find(left_str)+len(left_str):line.find(right_str)])
            else:
                new_text.append(line[line.rfind(left_str)+len(left_str):])
    return new_text

search_rightの逆。

キーワードを文章の左から検索して、文字列を抽出する。

抽出終了キーワードが発見できなかったら、その段落も最後まで抽出する。

まとめ

文章からキーワードに挟まれた文字列を抽出するスクリプトを作成しました。

このスクリプトは、コードを変換したり、コードの一部を抽出するのに使えるかもしれません。

コメント

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