parse lines to name value pairs

S

sunriselee

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!
 
P

Paul McGuire

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()
 
P

Paul McGuire

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']]
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,230
Latest member
LifeBoostCBD

Latest Threads

Top