在准备我的AS-Level计算机科学考试时,我在预发布材料中遇到了一个问题:
提示用户输入用户ID并检查ID的格式是否与预定义的格式规则相对应并相应地输出。
格式(按顺序):
示例:“Abc123”
我想出了一个使用我选择的语言(Python)的解决方案,然而,我想知道是否有更优雅或更好的方法来解决这个问题。特别是第三次检查。
这是我的代码:
#Task 2.2
u_id = input("Input User ID: ") #DECLARE u_id : string
numbers = [str(num) for num in range(10)]
#Checking if final 3 characters of User ID (u_id) are digits
for i in list(u_id[3::]):
if i not in numbers:
digit_check = False #DECLARE digit_check : bool
break
else:
digit_check = True
#User ID format check
if (u_id[0:1].isupper() == True) and (u_id[1:3] == u_id[1:3].lower()) and (digit_check == True):
print ("Correct Format")
else:
print ("Wrong Format")
忽略DECLARATION评论。这是考试要求。
由于
答案 0 :(得分:9)
如果您被允许导入re:
import re
u_id = input("Input User ID: ") #DECLARE u_id : string
rex = re.compile("^[A-Z][a-z]{2}[0-9]{3}$")
if rex.match(u_id):
print("Correct format")
else:
print("Incorrect")
表达的解释:
^
表示字符串的开头。[A-Z]
是一个范围,包含所有大写字母(英文字母)。[a-z]
是一个范围,包含所有小写字母。[0-9]
是一个范围,包含所有数字。{n}
指定 n 项目(项目是大括号之前的内容)将匹配。$
表示字符串的结尾。 此外,您可以针对此正则表达式 here查看更详细的解释并测试任意字符串。
答案 1 :(得分:2)
如果你想在没有正则表达式的情况下解决它(请注意,在这种情况下,它们是正确的工具!),你可以这样做:
id_format = [
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", # or string.ascii_uppercase etc.
"abcdefghijklmnopqrstuvwxyz",
"abcdefghijklmnopqrstuvwxyz",
"0123456789",
"0123456789",
"0123456789",
]
def check(input):
# check for same length
if len(input) != len(id_format):
return False
for test, valid in zip(input, id_format): # itertools.zip_longest can make
if test not in valid: # the length check unnecessary
return False
return True
check("Abc123") # True
check("abc123") # False