[英]how to match a USN using regular expression in Python?
给定USN:1722AB3401,范围:3401至3470。
如果将1722AB3433作为输入给出,则应显示有效的USN,如果未输入(例如:1722AB3499),则应显示无效的USN。
如何使用python解决此问题?
我尝试了以下方法(使用Python 3.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是大学序列号
您的期望是错误的,因为您的正则表达式显然允许3400..3479。
我不赞成尝试使用正则表达式完全获得验证,即使它可以与复杂的表达式一起使用也是如此。
pattern = r"1722AB34(([0-6][0-9])|70)"
我会尝试提取字符后面的数字并进行数字比较。
混合数字范围的正则表达式往往非常复杂。 在您的情况下,对于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')
我希望仅测试您的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")
[0-7][0-9]
范围是00到79。您需要使用:
pattern = r"1722AB34(0[1-9]|[1-6][0-9]|70)"
这将匹配01 to 09
或10 to 69
或70
但是获取最后四个数字,然后转换为整数并进行比较将是更好的方法。
根据其他答案中给出的建议,确定USN是否有效的最佳方法是检查USN的后四位数字的范围。
usn = '1722AB3469' # Given USN
last_four_digits = int(usn[-4:]) # Slice the string to get only the last four digits, then convert it to an integer
unchanged_pattern = usn[:6] # Find the pattern that doesn't change across all USNs
if (last_four_digits >= 3401 and last_four_digits <= 3470) and unchanged_pattern == "1722AB": # Check the range of the extracted number, and also the unchanged pattern
print('Valid USN')
else:
print('Invalid USN')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.