Re: parse lines to name value pairs
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
Re: parse lines to name value pairs
Damned cut-and-paste in GoogleGroups edit window (leading '.'s are to retain spacing): .# get pyparsing at http://pyparsing.sourceforge.net . .from pyparsing import quotedString, printables, Word, OneOrMore, Forward, Literal,delimitedList,Group . .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) . .for testdata in (line1, line2): .print lineDef.parseString(testdata).asList() . Gives this 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']] -- http://mail.python.org/mailman/listinfo/python-list
parse lines to name value pairs
Hi all, I want to parse some string lines into name value pairs, where the value will be a list. Here are some sample lines: line1 = path {{data/tom} C:/user/john} line2 = books{{book music red} {book {math 1} blue} {book {tom's book} green}} For line1, the name is path, the name-value should be the following forms: [path, [data/tom, C:/user/john]] For line 2, the name is books, and the value should be a list in either one of the following forms (either one is ok): [books, [[book,music,red],[book,math 1,blue],[book, tom's book, green]]] or [books, [book,music,red,book,math 1,blue,book, tom's book, green]] Any ideas? Many thanks! -- http://mail.python.org/mailman/listinfo/python-list