如何调整re.compile正则规则以支持匹配带可选字段的多种文本变体
正则修改实现方案
你需要把Line、Seq两个匹配段标记为可选,同时修正原正则末尾多余引号的语法错误,即可兼容所有要求的格式变体。
修改后代码
直接替换原re.compile对应的正则规则即可,后续的匹配、写入逻辑不需要改动:
pattern = re.compile(r"([a-zA-Z]+[0-9]+)(?: Line ([0-9]+))?(?: Seq ([0-9]))? ([0-9]+/[0-9]+/[0-9]+)") matches = pattern.finditer(body) writer.writerows(map(lambda m: m.groups(), matches))
注:原正则末尾存在多余双引号的笔误会导致编译失败,修改时已同步修正。
兼容格式
修改后的规则可正常识别三类目标内容:
- 完整格式:
ABC123456 Line 10 Seq 1 1/1/2022 - 仅缺Seq:
ABC123456 Line 10 1/1/2022 - 缺Line和Seq:
ABC123456 1/1/2022
规则说明
- 用
(?:...)?非捕获可选组包裹Line、Seq整段内容(包含段前的空格),表示该段可以出现0次或1次,不会因为段缺失导致空格匹配失败 - 保留原有捕获组的顺序:
- 匹配完整格式时,返回结果为
('ABC123456', '10', '1', '1/1/2022') - 匹配缺省Seq的格式时,Seq对应捕获位返回
None,结果为('ABC123456', '10', None, '1/1/2022') - 匹配缺省Line、Seq的格式时,Line、Seq对应捕获位均返回
None,结果为('ABC123456', None, None, '1/1/2022')
- 匹配完整格式时,返回结果为
可选优化
如果实际场景中Seq编号可能出现多位数字,可以把规则里Seq部分的([0-9])改成([0-9]+),适配更长的Seq值。
内容的提问来源于stack exchange,提问作者LaunchCoder33
相关产品推荐
相关产品推荐

