■概要
以下のような開始・終了文字列間の文字列を取得し、表示する。
- 開始文字列:ABC
- 終了文字列:XYZ
- 対象の文字列:SRFSABCDEFGHIJKLMNOPQRSTUVWXYZ11
- 実行結果:ABCDEFGHIJKLMNOPQRSTUVWXYZ
エラーハンドリングとしては、以下の2つを実装する。
- 開始-終了の間に開始文字列あり
例:SRFSABCDEFABCGHIJKLMNOPQRSTUVWXYZ11 - 開始の前に終了文字列あり
例:SRXYZFSABCDEFGHIJKLMNOPQRSTUVWXYZ11
■フローチャート
本処理のフローチャートを以下に示す。
■サンプルコード
サンプルコードを以下に示す。
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