Parsing Nested List

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Feb 4 18:03:25 EST 2018


On Sun, 04 Feb 2018 14:26:10 -0800, Stanley Denman wrote:

> I am trying to parse a Python nested list that is the result of the
> getOutlines() function of module PyPFD2 using pyparsing module.

pyparsing parses strings, not lists.

I fear that you have completely misunderstood what pyparsing does: it 
isn't a general-purpose parser of arbitrary Python objects like lists. 
Like most parsers (actually, all parsers that I know of...) it takes text 
as input and produces some sort of machine representation:

https://en.wikipedia.org/wiki/Parsing#Computer_languages


So your code is not working because you are calling parseString() with a 
list argument:

    myparser.parseString(List)


The name of the function, parseString(), should have been a hint that it 
requires a *string* as argument.

You have generated an outline:

    List = pdfReader.getOutlines()

but do you know what the format of that list is? I'm going to assume that 
it looks something like this:

['ABCD 01 of 99', 'EFGH 02 of 99', 'IJKL 03 of 99', ...]

since that matches the template you gave to pyparsing. Notice that:

- words are separated by spaces;

- the first word is any arbitrary word, made up of just letters;

- followed by EXACTLY two digits;

- followed by the word "of";

- followed by EXACTLY two digits.

Furthermore, I'm assuming it is a simple, non-nested list. If that is not 
the case, you will need to explain precisely what the format of the 
outline actually is.

To parse this list is simple and pyparsing is not required:

for item in List:
    words = item.split()
    if len(words) != 4:
        raise ValueError('bad input data: %r' % item)
    first, number, x, total = words
    number = int(number)
    assert x == 'of'
    total = int(total)
    print(first, number, total)




Hope this helps.

(Please keep any replies on the list.)



-- 
Steve




More information about the Python-list mailing list