如何解析大学课程表中的复杂场地与规则字符串?
解析复杂场地规则字符串的实现思路
一、优先用正则规则匹配(适配已知格式)
既然已经整理了所有现有格式,针对性写正则是最快的解决方式,针对你提到的三个失败案例,拆解模式后编写分层规则:
1. 逐个匹配失败案例的模式
- 针对
313 (WEEK 1-3) / ONLINE:匹配带周范围的主备场地
捕获组1是主场地,组2是生效周范围,组3是备用场地。^(\w+) \(WEEK (\d+-\d+)\) \/ (\w+)$ - 针对
ONLINE ON 13/09, 108 ON 01/11 (STARTS AT 9:00):匹配多日期指定场地+时间调整
先拆分每个^((?:\w+ ON \d{2}\/\d{2},? )+)(\w+ ON \d{2}\/\d{2})(?: \((STARTS AT \d{2}:\d{2})\))?$场地 ON 日期单元,再提取可选的时间规则。 - 针对
314 (312 ON 12/09,19/09,26/09) 301 ON 03/10:匹配嵌套日期替换的多场地
捕获主场地、括号内的临时替换场地+日期列表、外部的另一个临时场地+日期。^(\w+) \((\w+ ON (?:\d{2}\/\d{2},?)+)\) (\w+ ON \d{2}\/\d{2})$
2. 构建解析流程
- 先通过正则预匹配判断字符串属于哪种模式
- 提取对应字段后,统一转换成结构化数据,比如:
# 示例结构化输出 { "primary_location": "313", "valid_weeks": "1-3", "alternate_locations": [{"location": "ONLINE", "valid_dates": None}] }
二、用语法分析工具维护(应对格式扩展)
如果后续格式可能新增,用pyparsing这类语法定义工具比正则更易维护:
from pyparsing import Word, nums, alphas, Suppress, Group, delimitedList, Optional # 定义基础元素 location = Word(alphas + nums) date = Word(nums + "/") week_range = Suppress("WEEK") + Word(nums + "-") time_rule = Suppress("(") + Suppress("STARTS AT") + Word(nums + ":") + Suppress(")") # 定义三种失败案例的语法规则 week_based_rule = location + Suppress("(") + week_range + Suppress(")") + Suppress("/") + location multi_date_rule = delimitedList(Group(location + Suppress("ON") + date)) + Optional(time_rule) nested_date_rule = location + Suppress("(") + Group(location + Suppress("ON") + delimitedList(date)) + Suppress(")") + Group(location + Suppress("ON") + date) # 解析示例 result = nested_date_rule.parseString("314 (312 ON 12/09,19/09,26/09) 301 ON 03/10") print(result.asList()) # 输出: ['314', ['312', '12/09', '19/09', '26/09'], ['301', '03/10']]
新增格式时,只需扩展对应的语法规则即可,无需修改大量正则。
三、机器学习方案(处理未知格式)
如果遇到未覆盖的新格式,可以用少量标注数据做实体提取或格式分类:
1. 自定义NER实体提取
用spaCy训练自定义命名实体识别模型,标注LOCATION(场地)、DATE(日期)、WEEK_RANGE(周范围)、TIME_ADJUST(时间调整)等实体,训练后直接从字符串中提取各类实体,再组合成结构化数据。
2. 格式分类+规则解析
用文本分类模型(比如基于BERT的轻量模型)把新字符串归类到已有的模式类别,再调用对应规则解析。只需标注少量样本即可训练,适合格式迭代快的场景。
四、测试迭代建议
把所有整理的格式(包括这三个失败案例)写成单元测试用例,每次调整解析逻辑后跑测试,确保覆盖所有场景;遇到新格式时,先补充规则/语法,再更新测试用例。
内容的提问来源于stack exchange,提问作者DanteTemplar
相关产品推荐
相关产品推荐

