我有一个大文件,有几行,如下所示。我只想读入那些有初始化模式的行,然后从名称中去掉初始化,只在变量中保存OSD模式的部分。然后我需要读取相应的十六进制值,在本例中是8'h00,并从中去掉8'h,用一个x替换它并保存在一个变量中。
我一直在尝试去掉初始化、空格和=的内容,代码变得非常混乱。
localparam OSD_MODE_15_H_ADDR = 16'h038d;
localparam OSD_MODE_15_H_INIT = 8'h00
你能推荐一种清洁的方法吗?
谢谢!
最佳答案
下面的解决方案使用正则表达式(编译以加快搜索速度)来匹配相关行并提取所需信息。表达式使用命名组“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行的hexvalue,并将INIT hexvalue编一个字典到ADDR hexvalue。
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字典可能有助于更轻松地实现您的目标。如果有几个具有相同ID和不同hexvalues的INIT(或ADDR)行,那么上述dict方法将不能以直接的方式工作。