如何用Python正则提取DBC文件中指定BO_ ID的BO_块
Python正则提取指定ID范围的BO_完整块
需求
从包含多个BO_块的文本中,提取ID在[53, 69]范围内的完整BO_块。每个BO_块以BO_开头,后续是多行SG_内容,直到下一个BO_或文本结束。
之前尝试的问题
- 第一个正则仅捕获
BO_行和第一个SG_行:原因是正则未处理SG_行前的换行空格,导致后续SG_行无法匹配。 - 第二个正则贪婪匹配一次性捕获除最后一个外的所有
BO_块:原因是((.|\n)*)为贪婪模式,会从第一个BO_一直匹配到倒数第二个BO_的开头。
解决方案
精准匹配正则
针对需求构造的正则,既限定ID范围,又能完整捕获所有SG_行:
import re # 匹配ID在53-69之间的完整BO_块 pattern = r'BO_ (5[3-9]|6[0-9]) (\w+) *: (\w+) (\w+)(?:\n\s+SG_.*)*' # 假设已从数据源获取到目标文本存入text变量 matches = re.findall(pattern, text, re.MULTILINE)
正则解释
5[3-9]|6[0-9]:精准匹配53-59、60-69的ID,覆盖需求的[53,69]范围(?:\n\s+SG_.*)*:非捕获组,匹配任意数量的SG_行:\n\s+:匹配换行符及SG_行前的空格SG_.*:匹配整行SG_内容*:兼容无SG_的特殊情况
动态ID范围写法(可选)
如果需要动态指定ID范围,可用raw f-string构造正则的ID匹配部分(需根据实际范围调整正则逻辑):
min_id = 53 max_id = 69 # 针对53-69构造ID匹配规则 id_regex = f'(5[3-9]|6[0-9])' pattern = rf'BO_ {id_regex} (\w+) *: (\w+) (\w+)(?:\n\s+SG_.*)*'
修复贪婪匹配问题(备选)
若想保留类似第二个正则的写法,需改为非贪婪匹配并明确块结束条件:
pattern = r'BO_ (5[3-9]|6[0-9]) (\w+) *: (\w+) (\w+)((?:.|\n)*?)(?=BO_|$)' matches = re.findall(pattern, text, re.DOTALL)
(?:.|\n)*?:非贪婪匹配任意字符(含换行)(?=BO_|$):正向预查,匹配到下一个BO_或文本末尾时停止
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

