Python中的字符串格式检查

4
在准备AS-Level计算机科学考试时,我遇到了一道预发布材料中的问题:
提示用户输入用户ID并检查ID的格式是否符合预定义的格式规则,并相应地输出。
格式(按顺序):
1.一个大写字母
2.两个小写字母
3.三个数字字符(数字)
例如:"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注释。它们是考试要求。

谢谢


3
使用正则表达式/([A-Z])([a-z]{3})([0-9]{3})/(类似这样,具体语法已经过时)会使得操作更加简单和干净。 - JCOC611
鉴于您没有具体的问题,这可能不是在stackoverflow上提出的好问题。对于这个问题,可能在stack exchange网络中有更好的网站(也许是程序员?)。 - Rook
1
了解正则表达式。它们对于这种类型的任务非常有用。 - Yaroslav Admin
2
如果u_id符合正则表达式r'[A-Z][a-z]{2}[0-9]{3}',则输出'Correct Format',否则输出'Wrong Format'。 - AChampion
@JCOC611 谢谢,我会研究一下的。我还没有学习正则表达式。 - Hassan.S
@Rook 我想那是真的。我会去程序员那里问一下... - Hassan.S
2个回答

13

如果您被允许导入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 个项目(项目是花括号前面的任何内容)。
  • $ 代表字符串的结尾。

此外,您可以在此处查看更详细的解释,并测试任意字符串是否与此 正则表达式 匹配


2
只有2个小写字符,而且你不需要把它们分组()。在$上的想法很好,所以你可能也应该有开头的^ - AChampion
我觉得现在应该没问题了。@AChampion,感谢您的建议! - JCOC611

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

1
return all(test in valid for test, valid in zip(input, id_format) 也可以工作。 - AChampion
面试中的好问题。 - AlokThakur
1
你也可以提供函数而不是字符串(例如 str.isupper,str.islower,str.isdigit...),这可能更有效率。 - JCOC611
@AChampion:太棒了! - Georg Schölly
@JCO611:我同意。我尝试创建最清晰的代码,你的正则表达式解决方案当然是“正确”的。 - Georg Schölly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接