解析 python 中的布尔表达式

Parse boolean expression in python

目前,我有一个布尔表达式,它支持 &(逻辑与)、|(逻辑或)、()(括号)运算符状态代码如 s, f, d, n, t 和工作名称。

状态代码表示作业的状态。 (例如:s = successf = failure 等...)作业名称用括号括起来,可选参数是引号内的数字。

示例i/p:

( s(job_A, "11:00") & f(job_B) ) | ( s(job_C) & t(job_D) )

我的要求是 Python 中这样一个给定的字符串,我需要用包含前缀的新作业名称替换现有的作业名称,其他所有内容都应该保持不变:

示例o/p:

( s(prefix_job_A, "11:00") & f(prefix_job_B) ) | ( s(prefix_job_C) & t(prefix_job_D) )

这个逻辑表达式可以像任何布尔表达式一样任意嵌套,并且作为一种非常规语言,我们不能使用正则表达式。

请注意:作业名称事先未知,因此我们无法将名称静态存储在字典中并执行替换。

我目前想到的方法是生成一个表达式树并在该树的 OPERAND 节点中执行替换,但是我不确定如何进行此操作。 python 中是否有任何库可以帮助我定义构建这棵树的语法?如何指定语法?

有人可以帮助我解决这个问题吗?

编辑:作业名称没有任何特定形式。作业名称的最小长度为 6,作业名称为带下划线的字母数字。

鉴于我们可以假设作业名称是字母数字 + _ 并且长度至少为 6,我们应该能够仅使用正则表达式来做到这一点,因为在给定的字符串中看起来没有其他东西看起来像那样。

import regex

exp = '( s(job__A, "11:00") & f(job__B) ) | ( s(job__C) & t(job__D) )'
name_regex = "([a-zA-Z\d_]{6,})"  # at least 6 alphanumeric + _ characters
prefix = "prefix_"

new_exp = regex.sub(name_regex, f"{prefix}\1", exp)
print(new_exp)