正则表达式:对于车牌而言,选用的正则表达式是"^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼A-Z]{1}[A-Z]{1}\s{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$",使用re模块中的findall方法可以对输入的车牌进行合法性判定
对实验要求,可以大致拆分为以下几个部分:
- 设置主循环:将文件以追加读写的方式打开,进行合法性判断、对非法的舍弃、合法中重复的位置定位,不重复的写入、关闭文件保存
- 合法性判断:首先定义了一个正则表达式,并使用其进行合法性判断
- 合法性重复性判断:设立一个列表,使用append方法将每次输入的字符都加入其尾,使用列表的count方法计算每次写入的字符串是否有重复,由于count会返回其在列表中的次数,一旦次数超过1,我们就判定为重复,届时使用列表的index方法返回的坐标+1即其在文本文件中第几行出现,打印出即可
实验测试结果如下:
可以看到输入的车牌号可以为汉字也可以是全英文,对车牌号数字数量不够或车牌号输入错误都会判定为输入非法,而正确的非重复的会将其保存至文本文件里,正确的重复的将不会保存。
源代码:
import re
paizi=[]
pattern_str = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼A-Z]{1}[A-Z]{1}\s{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$"
def is_car_number(pattern, string):
if re.findall(pattern, string):
return 1
else:
return 2
if __name__ == '__main__':
while True:
string_str=input('输入车牌号')
fp_exercise4 = open(r'D:\浙理课程相关资料\2022-2023上\python\exercise4_test.txt', 'a+')
if is_car_number(pattern_str, string_str)==2:
print("输入非法,请重新输入")
else:
paizi.append(string_str)#加到列表中,用于判定重复
if paizi.count(string_str)==2:#检测到重复信号
print("该车牌已经存在!它在第{}行".format(paizi.index(string_str)+1))
else:
print("输入正确,已保存!")
fp_exercise4.write(string_str + '\n')
fp_exercise4.close()