簡體   English   中英

如何在Python中使用正則表達式匹配USN?

[英]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 0910 to 6970

但是獲取最后四個數字,然后轉換為整數並進行比較將是更好的方法。

根據其他答案中給出的建議,確定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM