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

Python基于MOD11算法校验TIN时如何通过正则判断结构合法后执行后续代码

问题根因

re.search()匹配失败时返回的是Python内置的None对象,不是字符串'None',你写的if x != 'None'条件永远为真,结构不合法的TIN也会进入后续校验逻辑,访问不存在的下标时就触发索引越界错误。
另外你写的正则没有加首尾锚定,会出现前后包含多余字符的字符串也被判定为结构合法的问题,建议修正正则规则。

修复后的完整代码

import re

TIN = '5562000'
# 正则加^$锚定,严格匹配整个字符串的结构:7位数字+1位数字或K
match_res = re.search(r"^\d{7}[\dK]$", TIN)
if match_res is not None:
    print('Structure Valid')
    
    check = (int(TIN[0])*8) + (int(TIN[1])*7) + (int(TIN[2])*6) + (int(TIN[3])*5) + (int(TIN[4])*4) + (int(TIN[5])*3) + (int(TIN[6])*2)

    y = check / 11
    z = "{:.0f}".format(y)

    print(z, TIN[7])
    print(TIN[7] == str(z))

    # 逻辑判断用and而非位运算符&
    if TIN[7] == str(z) and str(z) != '0':
        print('Valid TIN')
    elif TIN[7] == 'K' and str(z) == '10':
        print('Valid TIN')
    elif TIN[7] == '0' and str(z) == '11':
        print('Valid TIN')
    else:
        print('Invalid TIN!')   

else:
    print('Invalid Structure')

可选优化点

  • 你当前的z计算用的是除法四舍五入,标准MOD11校验一般使用取模运算check % 11,你可以根据实际的算法要求确认是否需要调整这部分逻辑。
  • 判断相等建议统一用==而非is,is用于判断两个对象的内存地址是否一致,字符串场景下可能出现意料之外的结果。

内容的提问来源于stack exchange,提问作者alexherranz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 19:06:04