我从数据库中得到一个逻辑表达式字符串,需要将这些字符串放入一个列表列表中,以便进一步计算。我已经读了很多关于字符串解析的文章,但是到目前为止还没有找到答案。为了更容易理解这个问题,这里有3个例子:
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')
但是如何定义真正的解析器呢?你知道吗
其中一个主要的问题是我不知道如何处理任意出现的括号和不同长度的字符串。我一直在玩nestedExpr()-parser
工具箱中的pyparser
,但到目前为止还不能创建正确的行为。你知道吗
对于表达式的递归性质,可以使用
Forward
元素,对于可变长度子句,可以使用ZeroOrMore
。根据您现有的语法:这样,
expression.parseString
将为您的输入字符串生成以下结果:如果你想去掉输出中的
(
和)
,你应该在l_bracket
和r_bracket
上调用suppress()
。考虑到分组(使用Group
),这些并不是真正需要的。然后输出,例如,[['A', 'AND', ['B', 'OR', 'C'], 'AND', 'D', 'AND', 'E']]
作为第二个字符串。你知道吗conversion to DNF是另一回事,最好用另一个问题来问。你知道吗
下面是一个使用标记器和递归下降解析器给出所需结果的解决方案。不幸的是,我不熟悉
pyparsing
库,所以我没有使用它。你知道吗输出为
相关问题 更多 >
编程相关推荐