作者ccwang002 (亮)
看板Python
标题Re: [问题] c语言的array转换成list
时间Fri Aug 16 01:20:30 2013
※ 引述《neurone (明月照大江)》之铭言:
: input =
: {{ ITEM_I,
: 3,
: { 0x01, 0x02,0x03}},
: { ITEM_II,
: 3,
: { 0x11, 0x12,0x13}},
: };
: output = [ ["ITEM_I","3","0x01,0x02,0x03"],[ITEM_II, "3", "0x01,0x02,0x03"]]
原文恕删,这有另一种解法是实作一个简单的 Lexer,
但以下的解法比较简单,其实就是用 regex 硬解,提供您作参考。
如果 pattern 比您举的更复杂,可能用 Lexer 来处理反而会比较容易
可以搜寻 Lexer, Token, python re 等关键字
# parser.py
import re
txt = open('raw.h').read()
# parse the variable assignment
# e.g., var = { ... }
var_name, var_value = re.search(
'(\w+)\s*=\s*\{(.*)\};', # regex pattern
txt, # input string
re.DOTALL # '.' also matches '\n'
).groups() # a tuple with matched string in each (...) pattern
def clean(item):
'''trim spaces between comma for 3rd entry of item'''
cleaned = list(item) # convert from tuple to mutable list
cleaned[-1] = ','.join(entry.strip() for entry in cleaned[-1].split(','))
return cleaned
# parse the item array
# e.g., { ITEM_XXX, 000m, { ... }},
# then clean the { ... } part, no space between comma
l = [clean(item) for item in
re.findall('\{\s*(\w+),\s*(\d+),\s*\{([^}]*)\}\},', var_value)]
print(var_name, "=", l)
## 执行结果,把「input ...」那段文字存入 raw.h 中
In [1]: %run parser.py
input = [['ITEM_I', '3', '0x01,0x02,0x03'], ['ITEM_II', '3', '0x11,0x12,0x13']]
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.117.109
修增注解
※ 编辑: ccwang002 来自: 61.230.117.109 (08/16 01:24)
1F:推 neurone:请问若array内的element 长度不一样 可以这样做吗? 08/16 11:37
2F:→ neurone:我先试试看好了,感谢! 08/16 11:38
如果是有不同多组的 ITEM_xx array 这个程式不需要更动,ex 现在2组 -> 3, 4, ...
※ 编辑: ccwang002 来自: 61.230.162.248 (08/17 00:03)