Pyparsing обеспечивает быструю обработку разбора вложенных выражений.
import pyparsing as pp
LPAR, RPAR = map(pp.Suppress, "()")
expr = pp.Forward()
label = pp.Word(pp.alphas.upper()+'-') | "''" | "``" | "."
word = pp.Literal(".") | "''" | "``" | pp.Word(pp.printables, excludeChars="()")
expr <<= LPAR + label + (word | pp.OneOrMore(expr)) + RPAR
sample = """
(TOP (S (NP (DT The)
(NNP Fulton)
(NNP County)
(NNP Grand)
(NNP Jury))
(VP (VBD said)
(NP (NNP Friday))
(SBAR (-NONE- 0)
(S (NP (DT an)
(NN investigation)
(PP (IN of)
(NP (NP (NNP Atlanta))
(POS 's)
(JJ recent)
(JJ primary)
(NN election))))
(VP (VBD produced)
(NP (`` ``)
(DT no)
(NN evidence)
('' '')
(SBAR (IN that)
(S (NP (DT any)
(NNS irregularities))
(VP (VBD took)
(NP (NN place)))))))))))
(. .))
"""
result = pp.OneOrMore(expr).parseString(sample)
print(' '.join(result))
Отпечатки:
TOP S NP DT The NNP Fulton NNP County NNP Grand NNP Jury VP VBD said NP NNP Friday SBAR -NONE- 0 S NP DT an NN investigation PP IN of NP NP NNP Atlanta POS 's JJ recent JJ primary NN election VP VBD produced NP `` `` DT no NN evidence '' '' SBAR IN that S NP DT any NNS irregularities VP VBD took NP NN place . .
Обычно такие парсеры используют pp.Group(expr)
для сохранения группировки вложенных элементов.,Но в вашем случае, так как вы в конечном итоге хотите получить плоский список в любом случае, мы просто опускаем это - стандартное поведение pyparsing - просто возвращать плоский список совпадающих строк.