Конвертировать строку с парантезами во вложенный список - PullRequest
3 голосов
/ 28 декабря 2011

Я хочу преобразовать строку, подобную этой:

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

в список, подобный этому:

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

Существует ли простое решение?

edit:Он должен работать для любого количества и глубины парантезов, но он должен работать только для допустимых строк (без единичных парантезов)

edit2: пробелы можно рассматривать как разделители, если они не совпадают, это может вызватьошибка или просто не работает, мне все равно.Это просто должно работать для правильно сформированных строк.

Ответы [ 2 ]

8 голосов
/ 28 декабря 2011

Вы можете использовать парсер 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 вместо!

1 голос
/ 29 декабря 2011

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 являются (), но они могут быть любой другой парой строк или выражений переноса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...