我從數據庫中獲取一串邏輯表達式,並且需要將這些字符串放入列表以供進一步評估。我已經嘗試了很多關於字符串解析的內容,但到目前爲止還找不到答案。對於這個問題更容易理解,這裏有3個例子:Python:將邏輯字符串解析爲列表的列表
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'
預期輸出繼電器:
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'] ]
所以基本上我需要完全工廠化表達式的OR
方面,把那些進入名單。這意味着任何AND
條件通過使兩個表達式在相同的sublist
中表達,而任何OR
條件觸發創建新的子列表。
e.g. E AND F --> [E, F], E OR F --> [[E],[F]]
來自數據庫的字符串具有任意長度和任意數量的括號。
任何人都知道如何定義語法,這樣我就可以使用例如pyparsing包?
語法的開始到目前爲止是:
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')
但是我怎麼都定義真正的解析器?
其中一個主要問題是我不知道如何處理任意發生的括號和字符串的長度變化。我一直在玩pyparser
工具箱中的nestedExpr()-parser
,但目前無法創建正確的行爲。
請告訴我們你嘗試過什麼至今。 –
@tobias_k或者如果他願意使用離散數學中使用的符號,他可以使用「+」或「*」。 –
所以,他只是爲了簡化表達。我正在考慮用詞法分析器(?)的行爲循環表達式。 –