is there an easy way to parse a nested list ?

Paul McGuire ptmcg at austin.rr.com
Mon Mar 16 15:49:58 CET 2009


On Mar 16, 4:29 am, Vlastimil Brom <vlastimil.b... at gmail.com> wrote:
> 2009/3/16 Vlastimil Brom <vlastimil.b... at gmail.com>:
>
>
>
> > 2009/3/16 Stef Mientki <stef.mien... at gmail.com>:
> >> hello,
>
> >> I need to parse a nested list, given as a string, like this
>
> >> line = " A  [  B  [ C+2 ] + 3 ] "
>
> > ...
>
> >> thanks,
> >> Stef
>
> > there is a "nestedExpr" (and probably other options, I'm not aware of ...:-)
> > ...
> > regards
> > vbr
>
> Well, I thought, there was something already there in the examples for
> pyparsing, but couldn't find it first.
> check the selective pyparsing evaluator, which also supports lists:
>
> http://pyparsing.wikispaces.com/file/view/parsePythonValue.py
>

The OPs test cases aren't really valid Python lists, so nestedExpr
will have to do:


from pyparsing import oneOf, alphas, Word, nums, OneOrMore, nestedExpr

# an element within the list can be:
# - a single alphabetic letter
# - one of + - * or /
# - an unsigned integer
element = oneOf(list(alphas+"+-*/")) | Word(nums)

expr = OneOrMore(element |
        nestedExpr("[", "]", content=OneOrMore(element))
        )

src = " A  [  B  [ C+2 ] + 3 ] "
print expr.parseString(src)

Prints:

['A', ['B', ['C', '+', '2'], '+', '3']]

Note that this is an actual Python nested list, the []'s of the
original string have been stripped away (they aren't needed, as the
nested structure that was defined by the []'s is now represented as a
data structure with actual nesting).

Also, pyparsing is pretty forgiving about whitespace.  This same
parser, even though no whitespace is explicitly mentioned, will just
as easily parse "A[B[C+2]+3]".

-- Paul
(More pyparsing info at http://pyparsing.wikispaces.com.)



More information about the Python-list mailing list