You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精准识别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 informationtext_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:33:33