gpt4 book ai didi

python - 尝试构建逻辑解析器时出错

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:52 25 4
gpt4 key购买 nike

所以我将这些字符串存储在数据库中,我想将它们转换为 python 表达式以将它们与 if 语句一起使用。我将把这些字符串存储到列表中并循环它们。例如:

string = "#apple and @banana or @grapes"

我可以通过将#替换为“a==”并将@替换为“b==”来转换此字符串:

if a == apple and b == banana or b == grapes

哈希指的是@ 指的是 b

但是当我使用 eval 时,它会抛出错误“apple 未定义”,因为 apple 不在引号中。所以我想要的是这样的:

if a == "apple" and b == "banana" or b == "grapes"

有什么办法可以做到这一点吗?存储在数据库中的字符串可以具有任何类型的格式,可以有多个和/或条件。

几个例子:

string[0] = "#apple and @banana or @grapes"
string[1] = "#apple or @banana and @grapes"
string[2] = "#apple and @banana and @grapes"

没有条件满足的情况下会有其他条件

谢谢

最佳答案

如果我理解正确的话,你正在尝试设置一些逻辑解析器 - 你想评估表达式是否可能为真。

@word or @otherword

始终为真,因为可以使用 @=word 来满足这一点,但是

@word and @otherword

不是,因为不可能满足这一点。您要使用的方法是使用Python的内置解释器,但您似乎“组成”了不存在的变量ab。只是为了给您一个这样的解析器的入门机会,这里有一个糟糕的实现:

from itertools import product
def test(string):
var_dict = {}
word_dict = {}
cur_var = ord('a')
expression = []
for i,w in enumerate(string.split()):
if not i%2:
if w[0] not in var_dict:
var_dict[w[0]] = chr(cur_var)
word_dict[var_dict[w[0]]] = []
cur_var += 1
word_dict[var_dict[w[0]]].append(w[1:])
expression.append('{}=="{}"'.format(var_dict[w[0]],w[1:]))
else: expression.append(w)
expression = ' '.join(expression)

result = {}
for combination in product(
*([(v,w) for w in word_dict[v]] for v in word_dict)):
exec(';'.join('{}="{}"'.format(v,w) for v,w in combination)+';value='+expression,globals(),result)
if result['value']: return True
return False

除了不检查字符串是否有效之外,这不是很好,但是是一个开始掌握您所追求的内容的地方。

它的作用是在第一个循环中创建表达式,同时保存将单词的第一个字符 (w[0]) 映射到从 a 到 z 命名的变量的哈希值(如果您想要更多)你需要做得比 cur_var+=1 更好)。它还将每个此类变量映射到原始表达式 (word_dict) 中分配给它的所有单词。

第二个循环运行一个非常糟糕的算法 - product 将给出变量和匹配单词的所有可能配对,我迭代每个组合并将我们的假变量分配给 exec 中的单词 命令。有很多理由避免 exec,但这对于设置变量来说是最简单的。如果找到满足表达式的组合,则返回 True,否则返回 False。如果您想分配内容(或用于 if、for、while 等),则不能使用 eval

通过编写自己的逻辑解析器来读取字符串,这并不能显着改善,尽管它可能会更长。

#Evaluted as (#apple and @banana) or @grapes) by Python - only #=apple @=banana satisfies this.
>>> test("#apple and @banana or @grapes")
True
#Evaluted as #apple or (@banana and @grapes) by Python - all combinations satisfy this as @ does not matter.
>>> test("#apple or @banana and @grapes")
True
#demands both @=banana and @=grapes - impossible.
>>> test("#apple and @banana and @grapes")
False

关于python - 尝试构建逻辑解析器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57303385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com