我编写了一个 python 代码来根据特定的 MOD11 算法检查字符串的有效性,但想进一步检查正则表达式是否字符串在开始时的结构正确。
TIN = '5562000'
import re
x = re.search("\d{7}(\d|K){1}", TIN)
if x != '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]) is str(z))
if ((TIN[7]) == str(z)) & (str(z) != '0'):
print('Valid TIN')
elif ((TIN[7]) == 'K') & (str(z) == '10'):
print('Valid TIN')
elif (TIN[7] == '0') & (str(z) == '11'):
print('Valid TIN')
else:
print('Invalid TIN!')
else:
print('Invalid Structure')
当结构有效,即字符数正确时,一切正常。但是,如果 TIN 变量中缺少一个字符,则会出现此错误:
print(z, TIN[7])
IndexError: string index out of range
所以,如果 TIN 的结构不正确,我需要一种不运行这部分代码的方法:
y = check / 11
z = "{:.0f}".format(y)
print(z, TIN[7])
print((TIN[7]) is str(z))
if ((TIN[7]) == str(z)) & (str(z) != '0'):
print('Valid TIN')
elif ((TIN[7]) == 'K') & (str(z) == '10'):
print('Valid TIN')
elif (TIN[7] == '0') & (str(z) == '11'):
print('Valid TIN')
else:
print('Invalid TIN!')
我尝试了带有 break 函数和 sys.exit 的 while 和 for 循环,也尝试了缩进,但我还没有那么好让它工作。关于如何完成这项工作的任何想法?
答案 0 :(得分:2)
关键错误是你对正则表达式结果的比较:
if x != 'None':
将 x
与字符串 "None"
进行比较,该字符串与 None
关键字不同:
>>> None == "None"
False
你希望你的支票是:
if x is not None:
那么,一切都应该正常了。
编辑:请记住,re.search
允许在正则表达式匹配前后添加其他字符。我想你可能不想要这里,所以你可能想改用 re.fullmatch
。
答案 1 :(得分:0)
你可以使用
try:
print(z, TIN[7])
except Exception as e:
print(e)
#further code
它将尝试执行 try
内的块。
如果它执行没有错误,那么它将继续继续而不考虑 except
部分。
如果该块有任何问题,它将执行 except
中的块并将错误存储在 e
中。