【Python】任意の開始・終了文字列間の文字を取得する

■概要

以下のような開始・終了文字列間の文字列を取得し、表示する。

  • 開始文字列:ABC
  • 終了文字列:XYZ
  • 対象の文字列:SRFSABCDEFGHIJKLMNOPQRSTUVWXYZ11
  • 実行結果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

エラーハンドリングとしては、以下の2つを実装する。

  • 開始-終了の間に開始文字列あり
    例:SRFSABCDEFABCGHIJKLMNOPQRSTUVWXYZ11
  • 開始の前に終了文字列あり
    例:SRXYZFSABCDEFGHIJKLMNOPQRSTUVWXYZ11

■フローチャート

本処理のフローチャートを以下に示す。

開始
開始
初期値の設定
  • 開始終了文字列判定用
  • 実行結果出力用
  • 開始終了フラグ
初期値の設定開始終了文字列判定用実行結果出力用開始終了フラグ…
文字列を1文字ずつ繰り返し
文字列を1文字ずつ繰り返し
開始終了文字列
判定用
開始終了文字列判定用…
> 2桁
> 2桁
その他
その他
先頭の1文字を削除し、1文字追加
先頭の1文字を削除し、1文字追加
1文字追加
1文字追加
開始終了文字列
判定用
開始終了文字列判定用…
開始文字列
開始文字列
その他
その他
開始終了フラグ
開始終了フラグ
False
False
True
True
異常終了
異常終了
開始終了フラグ
True
開始終了フラグ True
実行結果出力用に追加
実行結果出力用に追加
continue
continue
開始終了文字列
判定用
開始終了文字列判定用…
終了文字列
終了文字列
その他
その他
開始終了フラグ
開始終了フラグ
False
False
True
True
異常終了
異常終了
開始終了フラグ
False
開始終了フラグ False
実行結果出力用に追加
実行結果出力用に追加
continue
continue
開始終了フラグ
開始終了フラグ
False
False
True
True
実行結果出力用に追加
実行結果出力用に追加
実行結果出力
実行結果出力
終了
終了
Text is not SVG – cannot display

■サンプルコード

サンプルコードを以下に示す。

import logging


# 開始・終了文字列
START_VALUE = 'ABC'
END_VALUE = 'XYZ'

# 日付|ログレベル|モジュール名|ファンクション名|メッセージ
LOG_FORMATER = '%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s'

# ログレベル
logging.basicConfig(level=logging.INFO, format=LOG_FORMATER)

# 開始終了文字列判定
def split_start_end_value(input_str):
    # 初期値
    check_value = ''    # 開始終了文字列判定用
    result_value = ''   # 実行結果出力用
    is_data = False     # 開始終了フラグ

    # 文字列を1文字ずつ繰り返す
    for i in input_str:
        # 開始終了文字列判定用文字列が2文字より大きい
        if len(check_value) > 2:
            # 先頭の1文字を削除し、1文字追加(3文字をキープ)
            check_value = check_value[1:] + i
        else:
            # 1文字追加
            check_value += i

        # 開始文字列の場合
        if START_VALUE == check_value:
            # すでにTrueの場合はNG
            if is_data:
                logging.error('開始-終了の間に開始文字列があります:' + input_str)
                return 1
            # 開始終了フラグをTrue
            is_data = True
            # 実行結果に開始文字列を追加
            result_value += check_value

            continue

        # 終了文字列の場合
        elif END_VALUE == check_value:
            # すでにFalseの場合はNG
            if not is_data:
                logging.error('開始の前に終了文字列があります:' + input_str)
                return 1
            # 開始終了フラグをFalse
            is_data = False

            # 終端文字を追加(最後の1文字だけ)
            result_value += i
            
            continue

        if is_data:
            # 1文字追加
            result_value += i

    logging.info('実行結果:' + result_value)

    return 0


# メイン処理
if __name__ == '__main__':
    data1 = 'SRFSABCDEFGHIJKLMNOPQRSTUVWXYZ11'
    data2 = 'SRFSABCDEFABCGHIJKLMNOPQRSTUVWXYZ11'
    data3 = 'SRXYZFSABCDEFGHIJKLMNOPQRSTUVWXYZ11'
    split_start_end_value(data1)
    split_start_end_value(data2)
    split_start_end_value(data3)

■実行結果

▼正常系

インプット文字列:SRFSABCDEFGHIJKLMNOPQRSTUVWXYZ11

2024-06-01 11:30:17,625|INFO|split_start_end|split_start_end_value|実行結果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

▼異常系:開始-終了の間に開始文字列あり

インプット文字列:SRFSABCDEFABCGHIJKLMNOPQRSTUVWXYZ11

2024-06-01 11:30:17,625|ERROR|split_start_end|split_start_end_value|開始-終了の間に開始文字列があります:SRFSABCDEFABCGHIJKLMNOPQRSTUVWXYZ11

▼異常系:開始の前に終了文字列あり

インプット文字列:SRXYZFSABCDEFGHIJKLMNOPQRSTUVWXYZ11

2024-06-01 11:30:17,625|ERROR|split_start_end|split_start_end_value|開始の前に終了文字列があります:SRXYZFSABCDEFGHIJKLMNOPQRSTUVWXYZ11
タイトルとURLをコピーしました