Re: parse lines to name value pairs

2005-02-27 Thread 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()

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: parse lines to name value pairs

2005-02-27 Thread 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']]

-- 
http://mail.python.org/mailman/listinfo/python-list