【问题标题】:Parse boolean expression in python在python中解析布尔表达式
【发布时间】:2021-12-09 04:51:27
【问题描述】:

目前,我有一个布尔表达式,它支持&(逻辑与)、|(逻辑或)、()(括号)运算符以及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,并且作业名称是带有下划线的字母数字。

【问题讨论】:

  • 所以我想工作名称实际上并不都具有job_<x> 的形式。
  • 不,作业名称没有任何特定形式。它们可以是任意的
  • 作业名称是否被限制为具有最小长度或来自特定的字符集,或者您是否有一个名为 sfdnt 只要它在一组最大嵌套的括号内?
  • 我们可以假设 job_name 的最小长度是 6 并且作业名称是带有下划线的字母数字

标签: python string parsing autosys


【解决方案1】:

鉴于我们可以假设作业名称是字母数字 + _ 并且长度至少为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2022-07-05
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多