解析复杂的字符串

时间:2018-08-09 11:54:59

标签: python string parsing

我正在尝试解析具有某些定义的数据库。定义本质上是一个具有ID及其之间关系的字符串。

例如:(A,((B,C) (D,E))) F 其中空格表示AND,逗号表示OR。 根据定义,我想列出可能的组合。在此示例中,可能的组合为:

  • [A,F]
  • [B,D,F]
  • [B,E,F]
  • [C,D,F]
  • [C,E,F]

我尝试使用正则表达式过滤掉括号之间的组,并基于其他可能性创建一个适合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)

任何建议将不胜感激。

1 个答案:

答案 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)