You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python正则提取DBC文件中指定BO_ ID的BO_块

Python正则提取指定ID范围的BO_完整块

需求

从包含多个BO_块的文本中,提取ID在[53, 69]范围内的完整BO_块。每个BO_块以BO_开头,后续是多行SG_内容,直到下一个BO_或文本结束。

之前尝试的问题

  1. 第一个正则仅捕获BO_行和第一个SG_行:原因是正则未处理SG_行前的换行空格,导致后续SG_行无法匹配。
  2. 第二个正则贪婪匹配一次性捕获除最后一个外的所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:55:11