我正在尝试解析具有某些定义的数据库。定义本质上是一个具有ID及其之间关系的字符串。
例如:(A,((B,C) (D,E))) F
其中空格表示AND
,逗号表示OR
。
根据定义,我想列出可能的组合。在此示例中,可能的组合为:
我尝试使用正则表达式过滤掉括号之间的组,并基于其他可能性创建一个适合F作为根并生成叶子的树结构,但是它在更复杂的示例中尤其失败。 最复杂的例子之一是:
(K01647,K05942)(K01681,K01682)(K00031,K00030)(K00164 + K00658 + K00382,K00174 + K00175-K00177-K00176)(K01902 + K01903,K01899 + K01900,K18118)(K00234 + K00235 + K00236 + K00237,K00239 + K00240 + K00241-(K00242,K18859,K18860),K00244 + K00245 + K00246-K00247)(K01676,K01679,K01677 + K01678)(K00026,K00025,K00024,K00116)
任何建议将不胜感激。
答案 0 :(得分:0)
您可以使用Sympy解决此问题:
from sympy.parsing.sympy_parser import parse_expr
from sympy.logic.boolalg import to_dnf
# Convert to format Sympy likes
expr_text = "(A,((B,C) (D,E))) F".lower().replace(" ", " & ").replace(",", " | ")
# Create symbols we need
a, b, c, d, e, f = symbols('a b c d e f')
# Parse expression using our symbols.
expr = parse_expr(expr_text, global_dict=globals())`
to_dnf(expr)
给出类似
(a & f) | (b & d & f) | (b & e & f) | (c & d & f) | (c & e & f)