2011-04-28 2 views
3

J'essaie de faire une petite application qui utilise pyparsing pour extraire des données à partir de fichiers produits par un autre programme.Correspondance des lignes non vides avec pyparsing

Ces fichiers ont le format suivant.

SOME_KEYWORD: 
line 1 
line 2 
line 3 
line 4 

ANOTHER_KEYWORD: 
line a 
line b 
line c 

Comment puis-je construire la grammaire qui vous aidera à extraire line 1, line 2 ... line 4 et line a .. line c? Je suis en train de faire une construction comme celui-ci

Grammar = Keyword("SOME_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress() +\ 
     Keyword("ANOTHER_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress() 

Mais je ne sais pas comment définir NonEmptyLines et EmptyLine. Merci.

Répondre

7

Mon avis sur la question:

from pyparsing import * 

    # matches and removes end of line 
    EOL = LineEnd().suppress() 

    # line starts, anything follows until EOL, fails on blank lines, 
    line = LineStart() + SkipTo(LineEnd(), failOn=LineStart()+LineEnd()) + EOL 

    lines = OneOrMore(line) 

    # Group keyword probably helps grouping these items together, you can remove it 
    parser = Keyword("SOME_KEYWORD:") + EOL + Group(lines) + Keyword("ANOTHER_KEYWORD:") + EOL + Group(lines) 
    result = parser.parseFile('data.txt') 
    print result 

Le résultat est:

['SOME_KEYWORD:', ['line 1', 'line 2', 'line 3', 'line 4'], 'ANOTHER_KEYWORD:', ['line a', 'line b', 'line c']] 
+5

+1, belle réponse. Cette application est plutôt orientée ligne, donc définir une expression LineEnd() est plus ou moins inévitable. Habituellement, lorsque vous faites cela, vous voulez aussi redéfinir l'ensemble par défaut des caractères d'espaces pour ne pas inclure '\ n', en utilisant:' ParserElement.setDefaultWhitespaceChars ("\ t") ', juste après l'importation de pyparsing. Ensuite, vous pourrez détecter 'LineEnd() * (2, None)' en tant que séparateur entre les groupes de mots-clés. – PaulMcG

+0

Merci Paul! Cela a rendu la vie tellement plus facile! – user2662833

3

Cela vous prend la plupart du chemin:

import pyparsing as pp 

data = """ 
SOME_KEYWORD: 
line 1 
line 2 
line 3 
line 4 

ANOTHER_KEYWORD: 
line a 
line b 
line c 
""" 

some_kw = pp.Keyword('SOME_KEYWORD:').suppress() 
another_kw = pp.Keyword('ANOTHER_KEYWORD:').suppress() 
kw = pp.Optional(some_kw^another_kw) 

# Hint from: http://pyparsing.wikispaces.com/message/view/home/21931601 
lines = kw + pp.SkipTo(
    pp.LineEnd() + pp.OneOrMore(pp.LineEnd()) | 
    pp.LineEnd() + pp.StringEnd() | 
    pp.StringEnd() 
) 

result = lines.searchString(data.strip()) 
results_list = result.asList() 
# => [['\nline 1\nline 2\nline 3\nline 4'], ['\nline a\nline b\nline c']] 

Lors de la construction d'une grammaire, il aide vraiment à affecter des pièces à des variables et faire référence à celles où vous pouvez.

Questions connexes