如何精准识别Excel合同履约数据的错误类型及位置?
合同履约信息模板校验优化方案
问题背景
现有一份数千行的合同履约信息Excel文件,需按指定模板导入系统,但模板填写过程中易出错。正确模板格式为:
Object № {数字} Serviced {dd.mm.YYYY} Fulfilment of obligations under agr. № 90/11/122 dated 20.10.2010, VAT exempt.
原代码仅能返回“OK”或“not OK”,无法定位错误细节,需优化为精准识别错误类型及位置。
优化方案:分模块校验+错误详情输出
将模板拆分为固定文本段和可变字段两部分,使用带命名捕获组的正则表达式逐个校验,返回具体错误信息。
步骤1:定义带命名组的正则表达式
把模板拆解为多个可校验单元,每个单元对应一个命名组,便于快速定位错误:
import re import pandas as pd # 带命名捕获组的正则,覆盖模板所有组成部分 pattern = re.compile( r'^' r'(?P<prefix>Object № )' r'(?P<object_num>\d+)' r'(?P<serviced_text> Serviced )' r'(?P<service_date>(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.(20\d\d))' r'(?P<suffix> Fulfilment of obligations under agr. № 90\/11\/122 dated 20.10.2010, VAT exempt\.)' r'$' )
步骤2:编写校验函数
遍历每行数据,先匹配完整正则,若不匹配则逐个检查模板片段,返回精准错误描述:
def verify_template(text): match = pattern.match(text) if match: # 额外校验日期合法性(避免31.04.2023这类无效日期) try: day, month, year = map(int, match.group('service_date').split('.')) pd.to_datetime(f"{year}-{month}-{day}") except ValueError: return f"错误:日期无效 -> {match.group('service_date')}" return "OK" else: errors = [] # 检查前缀固定文本 if not text.startswith('Object № '): errors.append("缺失/错误前缀:'Object № '") # 检查后缀固定文本 if not text.endswith(' Fulfilment of obligations under agr. № 90/11/122 dated 20.10.2010, VAT exempt.'): errors.append("缺失/错误后缀") # 检查中间固定文本 if ' Serviced ' not in text: errors.append("缺失固定文本:' Serviced '") # 检查对象编号格式 num_match = re.search(r'Object № (\d+)', text) if not num_match: errors.append("对象编号缺失/格式错误(应为数字)") # 检查日期格式与合法性 date_match = re.search(r'(\d{2}\.\d{2}\.\d{4})', text) if not date_match: errors.append("日期缺失/格式错误(应为dd.mm.YYYY)") else: try: day, month, year = map(int, date_match.group().split('.')) pd.to_datetime(f"{year}-{month}-{day}") except ValueError: errors.append(f"日期无效 -> {date_match.group()}") # 拼接错误信息 return '; '.join(errors) if errors else "格式不匹配,无法识别具体错误"
步骤3:批量应用校验函数
用apply替代iterrows提升处理效率,生成错误详情列:
# 假设df为目标DataFrame,'original information'是待校验列 df['text_verification'] = df['original information'].apply(verify_template)
示例输出
| original information | text_verification |
|---|---|
| Object № 123 Serviced 31.04.2023 Fulfilment of obligations under agr. № 90/11/122 dated 20.10.2010, VAT exempt. | 错误:日期无效 -> 31.04.2023 |
| Object № ABC Serviced 01.01.2023 Fulfilment of obligations under agr. № 90/11/122 dated 20.10.2010, VAT exempt. | 对象编号缺失/格式错误(应为数字) |
| Object № 456 Service 01.01.2023 Fulfilment of obligations under agr. № 90/11/122 dated 20.10.2010, VAT exempt. | 缺失固定文本:' Serviced ' |
额外优化建议
- 若数据量极大(10万+行),可使用
swifter库加速apply操作 - 可将错误类型标准化,便于后续统计高频错误点
内容的提问来源于stack exchange,提问作者Oleg Romanov
相关产品推荐
相关产品推荐

