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
相关产品推荐
相关产品推荐

