2016-10-05 7 views
3

Ich versuche mit Pyparssing einen Parser zu erstellen, der auf den gesamten Text in einer beliebig verschachtelten Menge von Klammern passt. Wenn wir eine Zeichenfolge wie folgt betrachten:Pyparsing - passend zum äußersten Satz verschachtelter Klammern

"[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

Was ich möchte, ist für einen Parser in einer Art und Weise anzupassen, dass es zwei Spiele zurück:

[ 
    "[A,[B,C],[D,E,F],G]", 
    "[H,I,J]" 
] 

konnte ich ein wenig arbeit erreichen Version von diesem mit einer Sperrung von originalTextFor mit nestedExpr zusammen, aber das bricht, wenn Ihre Verschachtelung tiefer ist als die Anzahl der OriginalTextFor-Ausdrücke.

Gibt es eine einfache Möglichkeit, nur auf den äußersten Ausdruck von NestedExpr zuzugreifen, oder eine Möglichkeit, seine Logik so zu ändern, dass alles nach dem ersten gepaarten Match als Klartext behandelt und nicht geparst wird?

Update: Eine Sache, die in der Nähe zu kommen scheint, was ich erreichen will ist diese modifizierte Version der Logik von nestedExpr:

def mynest(opener='{', closer='}'): 
    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS)) 
    ret = Forward() 
    ret <<= (Suppress(opener) + originalTextFor(ZeroOrMore(ret | content)) + Suppress(closer)) 
    return ret 

Dies bringt mich dort von der Art und Weise der meisten, obwohl es eine zusätzliche Ebene ist Ich möchte wirklich, dass diese Klammern in die Zeichenfolge eingeschlossen werden (ohne in eine unendliche Rekursionssituation zu geraten, indem sie nicht unterdrückt werden).

parser = mynest("[","]") 
result = parser.searchString("[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]") 
result.asList() 
>>> [['A,[B,C],[D,E,F],G'], ['H,I,J']] 

Ich weiß, dass ich diese mit einem einfachen Liste Verständnis heraus abstreifen konnte, aber es wäre ideal, wenn ich gerade die zweite, redundante Ebene beseitigen könnte.

Antwort

2

nicht sicher, warum dies nicht funktionieren würde:

sample = "[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

scanner = originalTextFor(nestedExpr('[',']')) 

for match in scanner.searchString(sample): 
    print(match[0]) 

druckt:

'[A,[B,C],[D,E,F],G]' 
'[H,I,J]' 

Was ist die Situation, in der „das bricht, wenn der Verschachtelung ist tiefer als die Anzahl der OriginalTextFor Ausdrücke“?

+0

es war brechend, wenn eine parseAction hinzugefügt wurde, um zu ändern, was mit dem inneren Text passiert (einige benutzerdefinierte Textformatierung). Die größere Frage, die ich jetzt herausfinden möchte, ist, wie man das einzelne Ergebnis davon abhält, in eine verschachtelte Liste eingewickelt zu werden, ohne eine Liste zu verwenden (weil mein analysierter Text RIESIG ist und ich einen vermeiden möchte) mehr für die Schleife). –

+0

Ungruppe, vielleicht? – PaulMcG

Verwandte Themen