#!/usr/bin/env python3 """ output-style-check.py — 检查data-extractor输出的H/K/L列是否符合统一风格规范。 用法:python3 output-style-check.py -row-data.json 返回:exit 0 = 通过,exit 1 = 风格不符(列出具体问题) This is Layer 3 of the output consistency defense (see references/output-consistency.md). Run AFTER data extraction, BEFORE xlsx generation. If it fails, fix the specific issues in the JSON before proceeding. """ import json import sys import re def check_h_column(text): """检查H列(金额/费用)格式""" issues = [] # 禁止bullet符号 if re.search(r'[•\-\*]\s', text): issues.append("H列含bullet符号(•/-/*),应使用段落式叙述") # 禁止"大类·条款号"合并标题 if re.search(r'【[^】]*·第[一二三四五六七八九十\d]+条', text): issues.append("H列含'【大类·条款号】'合并标题,应分开写") # 必须有【】大类标注 if '【' not in text: issues.append("H列缺少【】大类标注(如【租金】【付款推算】等)") return issues def check_k_column(text): """检查K列(法律风险)格式""" issues = [] # 禁止统计式开头 if re.search(r'\d+项风险(\d+高', text): issues.append("K列用统计式开头(如'10项风险(3高/5中/2低)'),应以【整体评价】开头") # 禁止"序号·等级·条款号"标签 if re.search(r'\d+\.\s*【[高中低][中高]?·', text): issues.append("K列用'序号·等级·条款号'标签格式(如'1.【高·第十条】'),应用叙述式") # 禁止markdown表格 if '| #' in text or '|---|' in text: issues.append("K列含markdown表格,应用叙述式段落") # 必须有【整体评价】 if '【整体评价' not in text: issues.append("K列缺少【整体评价】段落") return issues def check_l_column(text): """检查L列(模版差异)格式""" issues = [] # 禁止统计式开头 if re.search(r'\d+处差异(\d+缺失', text): issues.append("L列用统计式开头(如'34处差异(16缺失/15修改/3新增)'),应叙述式说明") # 禁止分类小标题 if '【核心缺失' in text or '【核心修改' in text: issues.append("L列用'【核心缺失/修改】'分类小标题,应使用编号列表") # 禁止"vs"分隔 if ' vs ' in text: issues.append("L列用'vs'分隔模版和合同,应用中文叙述(如'模版为XX;本合同为XX')") return issues def main(): if len(sys.argv) < 2: print("用法: python3 output-style-check.py -row-data.json") sys.exit(2) filepath = sys.argv[1] try: with open(filepath, 'r', encoding='utf-8') as f: data = json.load(f) except Exception as e: print(f"❌ 无法读取文件: {e}") sys.exit(2) all_issues = [] # Check H column (fees) if 'fees' in data and data['fees']: h_issues = check_h_column(data['fees']) all_issues.extend(h_issues) # Check K column (risk_detail) if 'risk_detail' in data and data['risk_detail']: k_issues = check_k_column(data['risk_detail']) all_issues.extend(k_issues) # Check L column (diff_detail) if 'diff_detail' in data and data['diff_detail']: l_issues = check_l_column(data['diff_detail']) all_issues.extend(l_issues) # Check J column (status) - should be just "履行中", no extra text if 'status' in data and data['status']: status = data['status'].strip() if status not in ['履行中', '已到期', '已解除']: all_issues.append(f"J列状态值不规范: '{status}',应为'履行中'/'已到期'/'已解除'(不加括号说明)") if all_issues: print(f"❌ 风格检查未通过({len(all_issues)}个问题):") for i, issue in enumerate(all_issues, 1): print(f" {i}. {issue}") sys.exit(1) else: print("✅ 风格检查通过:H/K/L/J列格式符合统一规范") sys.exit(0) if __name__ == '__main__': main()