我的Python Vanity Plate校验代码为何始终返回Invalid?
你的代码问题分析
1. 长度校验完全错误
你写的has_valid_length函数要求车牌必须恰好6个字符,但标准 vanity plate 的长度规则是2到6个字符(包含2和6)。比如合法的"CS50"长度是4,直接被这个函数判定为无效,这是导致所有非6位的合法车牌都返回Invalid的根本原因。
修复代码:
def has_valid_length(s): return 2 <= len(s) <= 6
2. 格式校验逻辑严重缺失
你的has_valid_format只覆盖了两个特定车牌和「前两位字母+后面全数字」的情况,但漏掉了大量合法场景:
- 全字母的车牌(比如"ABC"、"HELLO")
- 未校验「一旦出现数字,后面必须全是数字」的规则(比如"AB1C"是无效的,但你的代码没做限制)
- 未校验第一个数字不能为0的规则(比如"AB012"是无效的,但你的代码会认为它合法)
正确的格式校验逻辑应该:
- 车牌必须以至少两个字母开头
- 一旦出现数字,后面所有字符必须都是数字
- 第一个出现的数字不能是0
- 不能有纯数字的车牌
修复后的示例代码:
def has_valid_format(s): # 开头必须是两个及以上字母 if not s[:2].isalpha(): return False digit_started = False for idx, char in enumerate(s): if char.isdigit(): digit_started = True # 第一个数字不能是0 if idx == 2 and char == '0': return False else: # 已经出现数字后不能再出现字母 if digit_started: return False return True
3. 额外说明
你的has_valid_characters函数是正确的,s.isalnum()确实能确保车牌只有字母和数字。
内容的提问来源于stack exchange,提问作者Reptar
相关产品推荐
相关产品推荐

