Python车牌验证函数bug:含中间数字的字符串误判为有效
车牌字符串验证逻辑修复
验证规则
- 第一个数字后的所有字符必须均为数字,不能包含字母
- 数字只能出现在字符串末尾,不能在中间(例如
AAA222有效,AAA22A无效) - 首个数字不能为“0”
现有代码
def main(): user_input = input("Plate: ") is_val = valid_plate(user_input) if is_val: print("Valid") else: print("Invalid") def valid_plate(plate): if len(plate) < 2 or len(plate) > 6: return False not_allowed = [" ", ",", "!", "."] for char in plate: if char in not_allowed: return False for char in plate: if char.isdigit(): if char.startswith("0"): return False elif plate[-1:].isdigit(): return True else: return False return True main()
问题分析
输入wil20p2这类字符串时,代码错误返回Valid,但实际应返回Invalid。原因是原代码仅检查字符串末尾是否为数字,未处理“中间出现数字后又出现字母”的场景,导致不符合规则的字符串被误判为有效。
修复后的代码
def main(): user_input = input("Plate: ") is_val = valid_plate(user_input) print("Valid" if is_val else "Invalid") def valid_plate(plate): # 检查长度是否在2-6之间 if len(plate) < 2 or len(plate) > 6: return False # 检查是否包含非法字符 not_allowed = [" ", ",", "!", "."] for char in plate: if char in not_allowed: return False found_digit = False for char in plate: if char.isalpha(): # 已遇到数字后不能再出现字母 if found_digit: return False elif char.isdigit(): if not found_digit: # 首个数字不能为0 if char == "0": return False found_digit = True # 非法字符已提前拦截,无需额外处理 return True main()
修复说明
- 新增
found_digit标记,跟踪是否已遇到数字 - 遍历字符串时,若已出现数字后再遇到字母,直接返回
False - 修正原代码中
char.startswith("0")的错误逻辑,单个字符直接用==判断是否为0 - 梳理分支逻辑,避免原代码中提前返回的错误判断
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

