Ich bekomme eine Reihe von logischen Ausdrücken aus einer Datenbank und muss diese in eine Liste von Listen zur weiteren Auswertung einfügen. Ich habe schon viel über das String-Parsing gelesen, konnte aber die Antwort bisher nicht finden. Zum besseren Verständnis des Problems, sind hier drei Beispiele:Python: Logische Zeichenfolge in Liste von Listen einteilen
input_string1 = '((A OR B) AND (C OR D)) OR E'
input_string2 = '(A AND (B OR C) AND D AND E)'
input_string3 = ' A OR (B AND C) OR D OR E'
erwartet ouput:
Results_string1=[ ['A', 'C'], ['A','D'], ['B','C'], ['B','D'], ['E']]
Results_string2=[ ['A', 'B', 'D', 'E'], ['A', 'C', 'D', 'E'] ]
Results_string3=[ ['A'], ['B','C'], ['D'], ['E'] ]
Also im Grunde muss ich die voll faktorisierter Ausdrücke in Bezug auf OR
und diese in die Liste gesetzt. Dies bedeutet, dass jede Bedingung ausgedrückt wird, indem beide Ausdrücke in derselben sublist
vorliegen, während jede OR
Bedingung die Erstellung neuer Unterlisten auslöst.
e.g. E AND F --> [E, F], E OR F --> [[E],[F]]
Die Strings aus der Datenbank haben eine beliebige Länge und eine beliebige Anzahl von Klammern.
Jeder hat eine Idee, wie die Grammatik zu definieren, so dass ich z. das Pyjarsing-Paket?
Der Beginn der Grammatik so weit ist:
import pyparsing as pp
gene_id = pp.Word(pp.alphanums)
logical = (pp.Keyword("AND") | pp.Keyword("OR")).setName("logical")
l_brackets = (pp.Literal('(')).setName('l_brackets')
r_brackets = (pp.Literal(')')).setName('r_brackets')
Aber wie habe ich den echten Parser definieren?
Eines der Hauptprobleme ist, dass ich nicht weiß, wie man mit den willkürlich auftretenden Klammern und variierenden Länge der Zeichenfolge umgehen soll. Ich habe mit der nestedExpr()-parser
aus der Toolbox pyparser
herum gespielt, aber konnte das korrekte Verhalten bis jetzt nicht herstellen.
Bitte zeigen Sie uns, was Sie bisher versucht. –
@tobias_k Oder er könnte '+' oder '*' verwenden, wenn er bereit ist, nach den Symbolen der Diskreten Mathematik zu suchen. –
Also, er soll nur den Ausdruck vereinfachen.Ich denke daran, den Ausdruck mit dem Verhalten eines lexikalischen Analysators (?) Zu durchlaufen. –