您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

用Python解析Lisp文件

用Python解析Lisp文件

如此答案所示,pyparsing似乎是正确的工具:

inputdata = '(1 ((st 8) (pitch 67) (dur 4) (keysig 1) (timesig 12) (fermata 0))((st 12) (pitch 67) (dur 8) (keysig 1) (timesig 12) (fermata 0)))'

from pyparsing import OneOrMore, nestedExpr

data = OneOrMore(nestedExpr()).parseString(inputdata)
print data

# [['1', [['st', '8'], ['pitch', '67'], ['dur', '4'], ['keysig', '1'], ['timesig', '12'], ['fermata', '0']], [['st', '12'], ['pitch', '67'], ['dur', '8'], ['keysig', '1'], ['timesig', '12'], ['fermata', '0']]]]

为了完整起见,这是格式化结果的格式(使用texttable):

from texttable import Texttable

tab = Texttable()
for row in data.asList()[0][1:]:
    row = dict(row)
    tab.header(row.keys())
    tab.add_row(row.values())
print tab.draw()



+ --------- + -------- + ---- + ------- + ----- + --------- +
| Timesig | keyig | st | 音高| dur | Fermata |
+ ========= + ======== + ============================= +
| 12 | 1 | 8 | 67 | 4 | 0 |
+ --------- + -------- + ---- + ------- + ----- + --------- +
| 12 | 1 | 12 | 67 | 8 | 0 |
+ --------- + -------- + ---- + ------- + ----- + --------- +

将该数据转换回Lisp表示法:

def lisp(x):
    return '(%s)' % ' '.join(lisp(y) for y in x) if isinstance(x, list) else x

d = lisp(d[0])
python 2022/1/1 18:52:16 有311人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶