[英]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.