如何在Python中使用正则表达式匹配USN?

如何在Python中使用正则表达式匹配USN?,python,Python,给定USN:1722AB3401和范围:3401至3470 如果1722AB3433作为输入提供,则应显示有效的USN,如果不是(例如:1722AB3499),则应显示无效的USN 如何使用python解决这个问题 我尝试了以下方法(使用Python 3.6.x): 但是,如果我尝试输入1722AB3471,它会给我一个错误的答案,因为范围是从*3401到*3470 注: USN是大学序列号,您的期望是错误的,因为正则表达式显然允许3400..3479 我不赞成完全使用正则表达式进行验证的尝试,

给定USN:1722AB3401和范围:3401至3470

如果1722AB3433作为输入提供,则应显示有效的USN,如果不是(例如:1722AB3499),则应显示无效的USN

如何使用python解决这个问题

我尝试了以下方法(使用Python 3.6.x):

但是,如果我尝试输入1722AB3471,它会给我一个错误的答案,因为范围是从*3401到*3470

注:
USN是大学序列号,您的期望是错误的,因为正则表达式显然允许3400..3479

我不赞成完全使用正则表达式进行验证的尝试,即使它可以处理像这样复杂的表达式

pattern = r"1722AB34(([0-6][0-9])|70)"

我会尝试提取字符后面的数字并进行数字比较。

您的期望是错误的,因为您的正则表达式显然允许3400..3479

我不赞成完全使用正则表达式进行验证的尝试,即使它可以处理像这样复杂的表达式

pattern = r"1722AB34(([0-6][0-9])|70)"

我将尝试提取字符后面的数字并进行数字比较。

[0-7][0-9]
将从00匹配到79。您需要使用:

pattern = r"1722AB34(0[1-9]|[1-6][0-9]|70)"
这将从
01到09
或从
10到69
70


但是获取最后四位数字,然后转换为整数并进行比较是更好的方法。

[0-7][0-9]
将从00匹配到79。您需要使用:

pattern = r"1722AB34(0[1-9]|[1-6][0-9]|70)"
这将从
01到09
或从
10到69
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='1722AB3471'
m=re.match('1722AB(\d{4}'),usn)

if m和3401混合数范围的正则表达式往往非常复杂。在您的情况下,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='1722AB3471'
m=re.match('1722AB(\d{4}'),usn)

如果m和3401我倾向于简单地测试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")

我倾向于只测试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")

根据其他答案中给出的建议,确定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')
usn='1722AB3469'#给定usn
last_four_digits=int(usn[-4:])#对字符串进行切片以仅获取最后四位数字,然后将其转换为整数
unchanged_pattern=usn[:6]#查找在所有usn中没有更改的模式

如果(最后四位数>=3401,并且最后四位数基于其他答案中给出的建议,则确定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')
usn='1722AB3469'#给定usn
last_four_digits=int(usn[-4:])#对字符串进行切片以仅获取最后四位数字,然后将其转换为整数
unchanged_pattern=usn[:6]#查找在所有usn中没有更改的模式

如果(最后四位>=3401,最后四位将最后四位转换为数字,并检查其是否在范围内?(好奇)什么是UN?“Dyz:谢谢”劳伦拉波特:美国大学是大学编号,最常用于给学生分配一个唯一ID。@ AsHY23,而不是通过帮助你的所有答案来循环接受“蜱虫”,考虑将它们作为对你有用的一种表示感谢的方式。然后回答回答你的Q。uestion:)将最后4位数字转换为数字,并检查其是否在范围内?(好奇)什么是UN?“Dyz:谢谢”劳伦拉波特:美国大学是大学编号,最常用于给学生分配一个唯一ID。@ AsHY23,而不是通过帮助你的所有答案来循环接受“蜱虫”,考虑将它们作为对你有用的一种表示感谢的方式。然后回答回答你的Q。uestion:)但这将忽略所有其他验证。我可以作为USN提供
'foo-bar-baz-qux 3465'
,这将是有效的…@poke是的,我没有意识到这一点。我的错。已编辑。但这将忽略所有其他验证。我可以作为USN提供
'foo-bar-baz-qux 3465'
,这将是有效的…@poke是的,我没有意识到这一点。我的错。已编辑。
int(usn[-4:])范围(34013472)
nice!我从来没有想过这样使用range。
int(usn[-4:])在range(34013472)
nice!我从来没有想过用这种方式使用范围。