给定一个USN: 1722AB3401和范围: 3401到3470。
如果给出1722AB3433作为输入,它应该显示有效的USN,如果不是(例如: 1722AB3499),它应该说无效USN。
如何使用python来解决这个问题?
我尝试了以下方法(使用Python3.6.x):
import re
pattern = r"1722AB34[0-7][0-9]"
if re.search(pattern, "1722AB3471"):
print("Valid USN")
else:
print("Invalid USN")但是,如果我尝试输入1722AB3471,它会给我一个错误的答案,因为范围是*3401到*3470。
注: USN是大学序列号
发布于 2017-09-04 06:51:43
混合数范围的Regexes往往相当复杂。就您的情况而言,对于范围为3401-3470的范围,您需要以下内容:
34(0[1-9]|[1-6][0-9]|70)只有当小数位内的范围变得更长、更复杂时,它才会变得更加复杂。
一个更好的方法是简单地提取这个数字部分,在正则表达式之外进行验证:
usn = '1722AB3471'
m = re.match('1722AB(\d{4})', usn)
if m and 3401 <= int(m.group(1)) <= 3470:
print('Valid USN')
else:
print('Invalid USN')发布于 2017-09-04 06:50:17
您的期望是错误的,因为您的正则表达式显然允许3400.3479。
我不赞成完全使用正则表达式获得验证的尝试,即使它可以处理一个复杂的表达式。
pattern = r"1722AB34(([0-6][0-9])|70)"我会尝试提取字符后面的数字,并对这个数字进行比较。
发布于 2017-09-04 06:53:08
我倾向于简单地测试你的USN的最后四位数。在if语句中添加一个附加术语:
import re
pattern = r"1722AB34[0-7][0-9]"
usn = "1722AB3470"
if re.search(pattern, usn) and int(usn[-4:]) in range(3401, 3472):
print("Valid USN")
else:
print("Invalid USN")https://stackoverflow.com/questions/46031575
复制相似问题