试图解决CS50 Python课程的问题。
卡在其中一个问题上:https://cs50.harvard.edu/python/2022/psets/2/plates/
解决了所有问题,但是“数字后面没有字母”的部分对我来说很难。
我不明白为什么我的解决方案不起作用。你知道吗?
请不要给予不同的解决方案,我读了其中的几个,我想了解哪里是我的版本中的错误。
def main():
plate = input("Plate: ").strip()
if is_valid(plate):
print("Valid")
else:
print("Invalid")
def is_valid(s):
# check for non-letters and non-numbers
if not s.isalnum():
return False
# check for correct length
if len(s) < 2 or len(s) > 6:
return False
# check for correct first two characters
if s[0].isdigit() or s[1].isdigit():
return False
# check for incorrect third character if there is any
if len(s) > 2 and s[2] == "0":
return False
# check for errors in 4, 5, 6 length plate nemes:
# 1. no first numeral with "0" value
i = 0
while i < len(s):
if s[i].isdigit():
if s[i] == "0":
return False
else:
break
i += 1
# 2. no letter after numeral
for i in range(len(s)):
if s[i].isdigit():
if i < len(s)-1 and s[i+1:].isalpha():
return False
# all possible errors checked
return True
main()
s[i+1:].isalpha()
部分似乎永远不会执行。
2条答案
按热度按时间lymnna711#
你所需要做的就是从这个语句中删除冒号。不需要检查数字后面的每个字符,只需检查下一个字符。
s[i+1].isalpha()
工作。rxztt3cl2#
使用regex可以更容易地做到这一点。下面的正则表达式很简单。它允许2到6个字母,后面可以跟不以零开始的数字。这涵盖了除了maxlength之外的所有规则,您可以在
is_valid
中轻松检查。最终,您将尝试从头开始创建自己的
re.match
版本,它只处理一种非常特定的情况。只要使用已经存在的re.match
,停止重新发明轮子。