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

■概要

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

対象

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

チェック対象

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

ログ出力内容

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

■フローチャート

■サンプルコード

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をコピーしました