【问题标题】:Python: need to stop running code, if a condition is met/not metPython:如果满足/不满足条件,需要停止运行代码
【发布时间】:2021-05-14 13:23:30
【问题描述】:

我编写了一个 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 循环,也尝试了缩进,但我还没有很好地让它工作。关于如何完成这项工作的任何想法?

【问题讨论】:

  • if len(TIN) < 7: print("TIN less than 7 characters") ?
  • 顺便说一句,{1} 从来没有必要或有用。如果只有一个,就不要指定任何重复。

标签: python regex


【解决方案1】:

关键错误是您对正则表达式结果的比较:

if x != 'None':

将x 与字符串"None" 进行比较,这与None 关键字不同:

>>> None == "None"
False

您希望您的支票是:

if x is not None:

那么,一切都应该正常了。

编辑:请记住,re.search 允许在正则表达式匹配之前和之后添加其他字符。我想你可能不想要这个,所以你可能想改用re.fullmatch。

【讨论】:

    【解决方案2】:

    你可以使用

    try:
        print(z, TIN[7])
    except Exception as e:
        print(e)
        #further code
    

    它将尝试执行try 内的块。 如果它执行时没有错误,那么它将继续进一步而不考虑except 部分。 如果该块有任何问题,它将执行except 中的块并将错误存储在e。

    【讨论】:

    • 虽然我同意一般来说 try-catch-handle 是一种 Python 方法,但我认为这不是一个好主意。您正在捕获所有异常,并且 try-block 会相对较大。这可能会阻止我们注意到错误,因为代码不能再失败,它只是简单地为任何输入返回“无效”。只捕获 IndexErrors 会更合适。但是,由于 try 块相当大,我认为在开始时进行长度检查会更好。请注意,正则表达式搜索已经进行了长度检查,但未正确检查结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多