Gee, no takers? Here's a (surprise!) pyparsing solution.
-- Paul .# get pyparsing at http://pyparsing.sourceforge.net . .from pyparsing import quotedString, printables, Word, OneOrMore, Forward, Literal,delimitedList,Group .quotedString.setParseAction(lambda s,l,t: t[0].strip("'\"")) . .line1 = """path {{data/tom} C:/user/john}""" .line2 = """books{{book music red} {book {math 1} blue} {book {tom's book} green}}""" . .lbrace = Literal("{").suppress() .rbrace = Literal("}").suppress() .listDef = Forward() . .nonbracechars = "".join([ c for c in printables if c not in "{}"]) . .# add more things to listItem, such as integers, etc. if your list has other than quoted strings .listItem = OneOrMore(Word(nonbracechars)) | quotedString | listDef . .print "With grouping" .listDef << lbrace + Group( OneOrMore(listItem) ) + rbrace .lineDef = Word(nonbracechars) + Group(listDef) . .for testdata in (line1, line2): . print lineDef.parseString(testdata).asList() . .print . .print "Without grouping" .listDef << lbrace + ( OneOrMore(listItem) ) + rbrace .lineDef = Word(nonbracechars) + Group(listDef) Givest the following output: With grouping ['path', [[['data/tom'], 'C:/user/john']]] ['books', [[['book', 'music', 'red'], ['book', ['math', '1'], 'blue'], ['book', ["tom's", 'book'], 'green']]]] Without grouping ['path', ['data/tom', 'C:/user/john']] ['books', ['book', 'music', 'red', 'book', 'math', '1', 'blue', 'book', "tom's", 'book', 'green']] for testdata in (line1, line2): print lineDef.parseString(testdata).asList() -- http://mail.python.org/mailman/listinfo/python-list