把车牌号提取功能封装成一个可调用的模块,函数封装。使其能够正确识别包含分隔符・的车牌号,并自动去除分隔符,同时兼容 5 位或 6 位字母 / 数字的情况。
主要用途为 yolo+PaddleOCR识别车牌号后,数据过滤。
规定车牌编号号规则顺序如下:
a)第一个字符省直辖市简称,
b)第二个字符 大写字母
c)第三个字符可能是 ‘·’
d)后面连续5或者6个字母或数字(不包含I、O)
e)结尾可能是挂学警港澳
license_plate_extractor.py
import re
# 优化后:减少冗余分组,保留核心匹配逻辑
re_str = r'[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][·]?[A-HJ-NP-Z0-9]{5,6}|[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][·]?[A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]'
# 配套提取函数(结合你的需求)
def extract_license_plates(text: str) -> list:
"""提取车牌号,自动去·、去重、过滤空结果"""
# 匹配所有符合规则的车牌
matched = re.findall(re_str, text)
# 清洗:去·、去重、过滤空值
cleaned = []
for plate in matched:
if plate: # 排除空匹配
clean_plate = plate.replace('·', '')
cleaned.append(clean_plate)
# 去重并保持顺序
cleaned = list(dict.fromkeys(cleaned))
return cleaned
# 测试
if __name__ == "__main__":
test_text1 = """
普通牌:京A12345、沪B·67890
新能源:粤C·A123456、苏D789012
特殊牌:鲁E1234挂、浙F5678警
无牌文本:今天没提车牌
"""
plates = extract_license_plates(test_text1)
# print(plates) 输出:['京A12345', '沪B67890', '粤CA12345', '苏D789012', '鲁E1234挂', '浙F5678警']
if not plates: # 列表为空(未找到车牌)
print("未找到车牌")
else: # 找到车牌,输出结果
print("提取到的车牌号有:")
for idx, plate in enumerate(plates, 1):
print(f"{idx}. {plate}")
test_text2 = "无车牌内容"
plates = extract_license_plates(test_text2)
# print(plates) 输出:['未找到车牌']
if not plates: # 列表为空(未找到车牌)
print("未找到车牌")
else: # 找到车牌,输出结果
print("提取到的车牌号有:")
for idx, plate in enumerate(plates, 1):
print(f"{idx}. {plate}")
main.py
from license_plate_extractor import extract_license_plates
# 待提取的文本
text = """
张三的车牌是浙A·888888(新能源),李四的车牌是鲁B99999,
王五和张三同车牌:浙A·888888,赵六的车牌是闽C·765432
"""
# 提取车牌号
plates = extract_license_plates(text)
# 判断结果并输出
if not plates: # 列表为空(未找到车牌)
print("未找到车牌")
else: # 找到车牌,输出结果
print("提取到的车牌号有:")
for idx, plate in enumerate(plates, 1):
print(f"{idx}. {plate}")
运行结果
提取到的车牌号有:
1. 浙A888888
2. 鲁B99999
3. 闽C765432
1865

被折叠的 条评论
为什么被折叠?



