以下解决方案使用正则表达式(为加快搜索速度而编译)来匹配相关行并提取所需信息。该表达式使用命名组“id”和“hexValue”来标识我们要从匹配行中提取的数据。
import re
expression = "(?P<id>\w+?)_INIT\s*?=.*?'h(?P<hexValue>[0-9a-fA-F]*)"
regex = re.compile(expression)
def getIdAndValueFromInitLine(line):
mm = regex.search(line)
if mm == None:
return None # Not the ..._INIT parameter or line was empty or other mismatch happened
else:
return (mm.groupdict()["id"], "0x" + mm.groupdict()["hexValue"])
编辑:如果我正确理解了下一个任务,您需要找到 ID 匹配的那些 INIT 和 ADDR 行的十六进制值,并将 INIT 十六进制值的字典制作为 ADDR 十六进制值。
regex = "(?P<init_id>\w+?)_INIT\s*?=.*?'h(?P<initValue>[0-9a-fA-F]*)"
init_dict = {}
for x in re.findall(regex, lines):
init_dict[x.groupdict()["init_id"]] = "0x" + x.groupdict()["initValue"]
regex = "(?P<addr_id>\w+?)_ADDR\s*?=.*?'h(?P<addrValue>[0-9a-fA-F]*)"
addr_dict = {}
for y in re.findall(regex, lines):
addr_dict[y.groupdict()["addr_id"]] = "0x" + y.groupdict()["addrValue"]
init_to_addr_hexvalue_dict = {init_dict[x] : addr_dict[x] for x in init_dict.keys() if x in addr_dict}
即使这不是您真正需要的,拥有 init 和 addr 字典也可能有助于更轻松地实现您的目标。如果有多个 _INIT(或 _ADDR)行具有相同的 ID 和不同的十六进制值,那么上述 dict 方法将无法直接工作。