目前,我有一個布爾運算式,它支持&(邏輯 AND)、|(邏輯 OR)、(、)(括號)運算子以及狀態代碼(如s, f, d, n, t作業名稱)。
狀態代碼表示作業的狀態。(例如:s = success,,f = 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,作業名稱為帶下劃線的字母數字。
uj5u.com熱心網友回復:
鑒于我們可以假設作業名稱是字母數字 _ 并且長度至少為 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333187.html
