【Python】括弧のフォーマットをチェックする

■概要

括弧が正しい形で閉じているかチェックする。
対象の括弧およびチェック仕様については以下の通り。

対象

  • 括弧の種類は [ ]・{ }・( ) の3種類

チェック対象

  • 閉じ括弧 ]・}・)で終わらないものはNG
    例:{aaa
  • 括弧の一部が入れ子になっているものはNG
    例:(a[bc)]
  • 余分な閉じ括弧で終わるものはNG
    例:{aaa}]

ログ出力内容

  • コンソール出力にする。
  • 出力形式は、「日付|ログレベル|モジュール名|ファンクション名|メッセージ」とする。
  • ログレベルはINFOとし、チェックNGの場合はERRORとする。

■フローチャート

開始
開始
チェック対象の括弧セット
チェック対象の括弧セット
閉じ括弧格納リスト初期化
閉じ括弧格納リスト初期化
文字列分繰り返し(1文字ずつ取得)
文字列分繰り返し(1文字ずつ取得)
「文字」が開き括弧
「文字」が開き括弧
No
No
閉じ括弧格納をリストに格納
閉じ括弧格納をリストに格納
「文字」が閉じ括弧
「文字」が閉じ括弧
閉じ括弧リスト
閉じ括弧リスト
データなし
データなし
データあり
データあり
return False
return False

閉じ括弧リスト[-1]
||
「文字」
閉じ括弧リスト[-1]…
return False
return False
閉じ括弧リスト[-1]を取り出す
閉じ括弧リスト[-1]を取り出す
閉じ括弧リスト
閉じ括弧リスト
データあり
データあり
データなし
データなし
return False
return False
return True
return True
終了
終了
YES
YES
YES
YES
No
No
No
No
YES
YES
Text is not SVG – cannot display

■サンプルコード

import logging

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

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

# 括弧判定処理
def check_bracket_format(chars):
    # チェック対象括弧のセット(key:value = 開き括弧:閉じ括弧)
    bracket_dict = {'{': '}', '[': ']', '(': ')'}
    
    # 閉じ括弧を格納するリスト
    stack_bracket_list = []
    
    # 文字列分繰り返し(1文字ずつ取得)
    for char in chars:
        # 開き括弧判定
        if char in bracket_dict.keys():
            # 閉じ括弧をリストに格納
            stack_bracket_list.append(bracket_dict[char])
        
        # 閉じ括弧判定
        if char in bracket_dict.values():
            # 閉じ括弧リストが空の場合
            if not stack_bracket_list:
                logging.error('「' + char + '」に対応する閉じ括弧がリストに格納されていません')
                return False
            
            # 対象の閉じ括弧が閉じ括弧リストの末端ではない場合
            if char != stack_bracket_list[-1]:
                logging.error('閉じ括弧の順序が不正です')
                logging.error('期待値:' + char + '| 実測値:' + stack_bracket_list[-1])
                return False
            else:
                # 閉じ括弧リストの末端を取り出す
                stack_bracket_list.pop()
    
    # 閉じ括弧リストに括弧が残っている場合
    if stack_bracket_list:
        logging.error('閉じ括弧がリストに残っています')
        logging.error('残っている閉じ括弧:' + str(stack_bracket_list))
        return False
    
    logging.info('チェック問題なし')
    return True


# メイン処理
if __name__ == '__main__':
    data = ''{ss[dd]ff(sd)}''
    check_bracket_format(data)

■実行結果

▼正常系

対象文字列:'{ss[dd]ff(sd)}’

2024-05-05 10:11:23,556|INFO|bracket_format|check_bracket_format|チェック問題なし

▼異常系:閉じ括弧リストなし

対象文字列:’){ss[dd]ff(sd)}’

2024-05-05 10:11:23,555|ERROR|bracket_format|check_bracket_format|「)」に対応する閉じ括弧がリストに格納されていません

▼異常系:閉じ括弧順序不正

対象文字列:'{ss[dd]ff(sd)}{[(])’

2024-05-05 10:11:23,556|ERROR|bracket_format|check_bracket_format|閉じ括弧の順序が不正です
2024-05-05 10:11:23,556|ERROR|bracket_format|check_bracket_format|期待値:]| 実測値:)

▼異常系:閉じ括弧残あり

対象文字列:'{ss[dd]ff(sd)}(‘

2024-05-05 10:11:23,556|ERROR|bracket_format|check_bracket_format|閉じ括弧がリストに残っています
2024-05-05 10:11:23,556|ERROR|bracket_format|check_bracket_format|残っている閉じ括弧:[')']
タイトルとURLをコピーしました