田中太郎
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の逆。
キーワードを文章の左から検索して、文字列を抽出する。
抽出終了キーワードが発見できなかったら、その段落も最後まで抽出する。
まとめ
文章からキーワードに挟まれた文字列を抽出するスクリプトを作成しました。
このスクリプトは、コードを変換したり、コードの一部を抽出するのに使えるかもしれません。
コメント