2013-04-30 55 views
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 

你可以建議一個精益和乾淨的方法來做到這一點?

謝謝!

+0

您是否嘗試過使用正則表達式或手動刪除「asfd」.replace()和朋友的部件? – 2013-04-30 21:29:21

回答

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"]) 

編輯:如果我理解正確的下一個任務,你需要找到那些INIT的hexvalues和ADDR行其ID匹配,使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字典可能有助於更容易地實現目標。如果有多個_INIT(或_ADDR)行具有相同的ID和不同的hexvalues,那麼上述字典方法將無法以直接的方式工作。

+2

您的最終捕獲將包含示例中第一行的分號。 另外,我認爲命名捕獲組在保持正則表達式可讀性方面有很多幫助。 – 2013-04-30 22:00:25

+0

將代碼編輯爲僅包含最後一組中的十六進制數字。 – astraujums 2013-04-30 22:10:15

+1

你正在匹配第一組中的localparam部分 – 2013-04-30 22:21:17

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()]) 
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 

正則表達式對於你的輸入例子是非常具體的。如果文件中的其他行略有不同,您可能需要稍微修改一下。

相關問題