繁体   English   中英

解析python中的布尔表达式

[英]Parse boolean expression in python

目前,我有一个支持“&”(逻辑与)、“|”的布尔表达式 (逻辑 OR)、'('、')'(括号)运算符以及状态代码,如 s、f、d、n、t 和作业名称。

状态代码表示作业的状态。 (例如:s = 成功,f = 失败等。)并且作业名称用括号括起来,并带有一个可选参数,该参数是引号内的数字。

示例 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM