2

我有一个包含几行的大文件,如下所示。我只想读取其中包含 _INIT 模式的行,然后从名称中删除 _INIT 并仅将 OSD_MODE_15_H 部分保存在变量中。然后我需要读取相应的十六进制值,在这种情况下为 8'h00,并从中剥离 8'h 并将其替换为 0x 并保存在变量中。我一直在尝试去掉_INIT、空格和=,代码变得非常混乱。

localparam OSD_MODE_15_H_ADDR = 16'h038d;
localparam OSD_MODE_15_H_INIT = 8'h00

你能建议一种简洁干净的方法来做到这一点吗?

谢谢!

4

3 回答 3

2

以下解决方案使用正则表达式(为加快搜索速度而编译)来匹配相关行并提取所需信息。该表达式使用命名组“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 方法将无法直接工作。

于 2013-04-30T21:56:53.467 回答
1

尝试这样的事情 - 不确定你的所有要求是什么,但这应该让你接近:

with open(someFile, 'r') as infile:
    for line in infile:
        if '_INIT' in line:
            apostropheIndex = line.find("'h")
            clean_hex = '0x' + line[apostropheIndex + 2:]

在“16'h038d;”的情况下,clean_hex 将是“0x038d;” (需要以某种方式删除“;”)并且在“8'h00”的情况下,clean_hex 将是“0x00”

编辑:如果你想防止像“;”这样的字符 你可以这样做并测试一个字符是否是字母数字:

clean_hex = '0x' + ''.join([s for s in line[apostropheIndex + 2:] if s.isalnum()])
于 2013-04-30T21:37:46.433 回答
1

您可以使用正则表达式和re.findall()函数。例如,要生成包含您想要的数据的元组列表,请尝试:

import re
lines = open("your_file").read()
regex = "([\w]+?)_INIT\s*=\s*\d+'h([\da-fA-F]*)"
res = [(x[0], "0x"+x[1]) for x in re.findall(regex, lines)]
print res

正则表达式对于您的输入示例非常具体。如果文件中的其他行略有不同,您可能需要稍作更改。

于 2013-04-30T22:33:26.797 回答