比较两个包含"表达式的字符串"为了平等

时间:2018-01-14 18:14:16

标签: python python-3.x

我有两个字符串,一个是"K <- L * 5",另一个是"K <- 5 * L"

有没有办法在Python 3中比较这些并返回True? (因为它们是相同的,但顺序不同)

我正在寻找一种解决方案来仅比较<-之后的第二部分

具体来说,我希望第二部分给出相同的结果。

E.g。

  • "5 % 3""3 % 5"不一样
  • "L * 5""5 * L"相同

也许字典可以提供帮助,但我对Python并不熟悉。

1 个答案:

答案 0 :(得分:1)

正如评论中所解释的那样,检查语义是一个障碍。您可以为这些数学表达式构建自己的(或找到其他人的)语法分析器。

解决方法是使用已内置的数学功能并将表达式转换为有效表达式。我选择在这里将所有数字和字母转换为它们的Ascii等价物。您可以选择自己在转换中有多挑剔(降低全部大写,仅使用某些字母等等),但这是一个有效的例子。

def main():

opt1_raw = "K <- N * 5" 
opt2_raw = "K <- 5 * N"

opt1 = opt1_raw.split("<-")[1]
opt2 = opt2_raw.split("<-")[1]

ascii_exp = ''.join([str(ord(char)) if char.isdigit() or char.isalpha() else char for char in opt1])
s = eval(ascii_exp)

ascii_exp = ''.join([str(ord(char)) if char.isdigit() or char.isalpha() else char for char in opt2])
p = eval(ascii_exp)

print(opt1 +" and " + opt2 +": " + str(s==p))

main()

在循环中,我将所有digitsalphas(字母)转换为等同的ascii,让“*”和“/”等运算符成为他们在哪里。然后我使用eval()让python评估表达式。评估结果可能如下所示:76*53而不是"L*5"然后我只是比较结果。我相信你可以找到一种更优雅的方式来合并它,但它是评估这种抽象表达式的一个例子。

输出:

L*5 and 5*L: True
L*5 and 5 % 3: False
5 % 3 and 3 % 5: False
L*5 and 5 % 3: False