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


parse lines to name value pairs

2005-02-26 Thread 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!

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