如何用正则表达式从数据手册提取寄存器信息?分组匹配遇阻求助
解决寄存器信息正则提取与CSV导出问题
你提到想用正则从数据手册里提取寄存器名称、地址、枚举值这类信息,在regexr上处理复杂场景卡壳,尤其是多分组导出CSV的时候碰到麻烦——我完全懂这种头疼的感觉!针对你给出的匹配模式和期望输出,我整理了一套实用的方案:
目标匹配逻辑拆解
先明确你要抓取的核心内容结构:
- 寄存器名称:
A2B_开头的标识(比如A2B_NODEADR) - 寄存器地址:
0x开头的两位十六进制值(比如0x01) - 枚举值:大写字母组成的多个可选标识(比如
BRCST、NODE)
定制化正则表达式
这里给出适配你需求的正则,带明确分组,方便后续导出:
(A2B_\w+).*?Address:\s*(0x[0-9A-Fa-f]{2}).*?(?:([A-Z]+)(?:,\s*([A-Z]+))*(?:,\s*([A-Z]+))*)?
分组说明:
- 第1组
(A2B_\w+):精准匹配寄存器名称,\w+能覆盖任意字母、数字或下划线后缀,适配不同命名的寄存器 - 第2组
(0x[0-9A-Fa-f]{2}):严格匹配两位十六进制的地址格式,不管大小写都能捕获 - 第3-5组:最多捕获3个枚举值(如果你的枚举值数量更多,只需要重复
(?:,\s*([A-Z]+))*这个结构即可)
匹配与CSV导出实操技巧
方式1:用编辑器快速处理(比如VS Code)
- 打开数据手册文本,开启正则查找模式
- 输入上面的正则,确认所有目标条目都能被匹配到
- 切换到替换模式,用
$1, $2, $3, $4, $5作为替换内容(空的分组会自动留空) - 把替换后的内容复制出来,保存为
.csv文件即可
方式2:用Python脚本灵活处理(适合大量数据)
如果数据手册内容很多,用脚本更高效,还能自动处理空值:
import re import csv # 把data替换成你的数据手册文本内容 data = """这里粘贴你的数据手册文本""" pattern = r"(A2B_\w+).*?Address:\s*(0x[0-9A-Fa-f]{2}).*?(?:([A-Z]+)(?:,\s*([A-Z]+))*(?:,\s*([A-Z]+))*)?" # 用re.DOTALL让.匹配换行符,re.IGNORECASE兼容小写十六进制 matches = re.finditer(pattern, data, re.DOTALL | re.IGNORECASE) with open("registers.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 先写表头 writer.writerow(["Register Name", "Address", "Enum Value 1", "Enum Value 2", "Enum Value 3"]) for match in matches: # 把分组内容转成列表,空分组用空字符串填充 row = [match.group(i) or "" for i in range(1, 6)] writer.writerow(row)
运行这个脚本后,会生成一个registers.csv文件,格式完全符合你期望的输出。
小提示
如果数据手册里的排版很乱(比如换行、空格不规律),记得保留re.DOTALL参数;如果地址里有小写的十六进制字母,加上re.IGNORECASE就能完美兼容。
内容的提问来源于stack exchange,提问作者David Nottebohm-Knochenhauer
相关产品推荐
相关产品推荐

