解析Lisp输入到python的问题

时间:2013-09-23 07:02:24

标签: python lisp pyparsing

我正在尝试将lisp输入解析为python列表。但是当我解析输入时,我得到了字符串列表,但我希望将单个元素作为int。

示例:当我解析以下输入时:"(2 (10 (5 11))) (5 6) (4)" 输出:[[['2'], ['10', '5']], [['5'], ['6']], [['4']]]

我使用:[[map(int, x) for x in lst] for lst in test]将字符串转换为int,但此函数只会解析级别为2的嵌套列表。但如果我有一个超过2的嵌套列表,我应该如何使用它解析?

我尝试过pyparsing,但我没理解它。

2 个答案:

答案 0 :(得分:5)

def as_int(xs):
    if isinstance(xs, list):
        return map(as_int, xs)
    elif isinstance(xs, str):
        return int(xs)
    return xs

用法:

>>> xs = [[['2'], ['10', '5']], [['5'], ['6']], [['4']]]
>>> print as_int(xs)
[[[2], [10, 5]], [[5], [6]], [[4]]]

答案 1 :(得分:3)

如果你想使用pyparsing,你可以不进行任何后处理,如下所示。

import pyparsing as pp

integer = pp.Word(pp.nums).setParseAction(lambda m:int(m[0]))
expr = pp.Forward()
expr << pp.nestedExpr(content=pp.OneOrMore(integer | expr))
manyExpr = pp.OneOrMore(expr)

print manyExpr.parseString('(2 (10 (5 11))) (5 6) (4)')
    #returns [[2, [10, [5, 11]]], [5, 6], [4]]

这首先将整数定义为仅由数字组成的东西,并告诉pyparsing如何将它从一串数字转换为整数对象。接下来,它将表达式定义为括号内的表达式或整数列表。最后,为了解析您的示例,它会查找许多连续的表达式。