2017-03-28 5 views
1

Ich versuche, eine Protokolldatei zu analysieren, die mehrere Einträge mit folgendem Format enthält:pyparsing: gehen Sie zum nächsten Token alles ignorieren zwischen

ITEM_BEGIN item_name 
    some_text 

some_text kann optional enthalten einen durch my_expr abgestimmt Ausdruck überall in sich selbst. Ich bin nur interessiert an item_name und my_expr (oder None, wenn es fehlt). Idealerweise ist das, was ich will, eine Liste von (item_name, my_expr) Paaren. Was ist der beste Weg, um diese Informationen mit Pyparsing zu extrahieren?

+0

Können Sie geben etwas mehr Detail, bitte? Also '' some_text'' könnte '' (item_name, myexprim) '' pairs 'oder nur 'my_expr' enthalten? Und wie oft? Machen Sie eine BNF oder geben Sie Beispiele für Eingabe und Ausgabe. – halloleo

Antwort

1

Wenn Sie nicht versuchen, einen Parser für den gesamten Eingabetext zu definieren, aber nur ein paar Stücke davon, schauen Sie in dem mit pyparsing searchString oder scanString Methoden - etwas in diese Richtung:

import pyparsing as pp 
ident = Word(alphas, alphanums+'_') 
item_header = pp.Keyword("ITEM_BEGIN") + ident("name") 
other_expr = ... whatever ... 

search_expr = item_header | other_expr 

found = {} 
current_name = '' 
for result in search_expr.searchString(input_text): 
    result = result[0] 
    if result[0] == "ITEM_BEGIN": 
     print("found an item header with name {name}".format_map(result)) 
     current_name = result.name 
     found[result.name] = [] 
    else: 
     # found an other expr 
     found[current_name].append(result.asList()) 
+0

Paul, vielen Dank für deine Antwort. Das funktioniert für mich. Ich habe tatsächlich einen anderen Weg gefunden, mit diesem Problem umzugehen. Ich habe einen Parser erstellt, der nach einem Textabschnitt sucht, der mit ITEM_BEGIN beginnt und von einem anderen ITEM_BEGIN beendet wird, und eine ParseAction angefügt hat, die my_expr.searchString() für den gefundenen Text aufruft. Das einzige Problem ist, dass Zeilenumbrüche als Literal '\\ n' enthalten sind - etwas, das ich gerade beheben möchte. – BlindDriver

Verwandte Themen