【问题标题】:Convert string with parantheses into nested list将带括号的字符串转换为嵌套列表
【发布时间】:2012-01-28 21:11:09
【问题描述】:

我想像这样转换一个字符串:

"asd foo bar ( lol bla ( gee bee ) lee ) ree"

到这样的列表:

["asd","foo","bar",["lol","bla",["gee","bee"],"lee"],"ree"]

有简单的解决方案吗?

编辑:它应该适用于任意数量和深度的括号,但它只适用于有效的字符串(没有单个括号)

edit2:空格可以看作是分隔符,如果不匹配可能会引发错误或不起作用,我不在乎。它只需要适用于格式良好的字符串。

【问题讨论】:

  • 你需要定义更多,例如字符串是否可以有空格,或者我们可以将任何空格视为分隔符,如果括号不匹配是否会引发错误?
  • 完成。 (空格可以看作是分隔符,如果不匹配可能会引发错误或不起作用,我不在乎。它只需要对格式正确的字符串起作用。)

标签: python string parsing list


【解决方案1】:

Pyparsing 自带一个内置的辅助方法,nestedExpr:

>>> from pyparsing import nestedExpr
>>> a = "asd foo bar ( lol bla ( gee bee ) lee ) ree"
>>> # have to put total string into ()'s
>>> printed nestedExpr().parseString("(%s)" % a).asList()[0]
['asd', 'foo', 'bar', ['lol', 'bla', ['gee', 'bee'], 'lee'], 'ree']

这里唯一的技巧是,为了让解析器保持简单,整个字符串必须被包裹在一对 () 中。 nestedExpr 的默认分隔符是 (),但可以是任何其他字符串对或 pyparsing 表达式。

【讨论】:

    【解决方案2】:

    您可以使用 Python 的解析器来完成这项工作。稍微帮忙一下:

    >>> a = "asd foo bar ( lol bla ( gee bee ) lee ) ree"
    >>> eval(str(a.split()).replace("'(',", '[').replace("')'",']'))
    ['asd', 'foo', 'bar', ['lol', 'bla', ['gee', 'bee'], 'lee'], 'ree']
    

    如果您需要它以确保安全,请改用ast.literal_eval

    【讨论】:

    • 谢谢,几乎可以了。只是第二种replace方法的小错误(括号和括号互换了)
    猜你喜欢
    • 2014-06-04
    • 2022-12-10
    • 1970-01-01
    • 2016-02-08
    • 2023-03-31
    • 2021-11-25
    • 2019-04-24
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多