gpt4 book ai didi

python - 从变量和运算符的排列生成表达式

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

所以,我决定是时候学习正则表达式了。于是,我开始着手解决各种问题,一帆风顺之后,我似乎碰壁了,需要帮助来摆脱困境。

任务:

给定一个字符和逻辑运算符列表,找到这些字符和运算符的所有可能的非乱码组合。

例如,给定:

my_list = ['p', 'q', '&', '|']

输出将是:

answers = ['p', 'q', 'p&q', 'p|q'...]

但是,像“pq&”和“p&|”这样的字符串是胡言乱语,因此不允许。

当然,随着向 my_list 添加的元素越多,过程就会变得越复杂。

我目前的方法:

(我想学习如何用正则表达式解决它,但我也很好奇是否存在更好的方法......但同样,我的重点是正则表达式)

第 1 步:

找到元素的所有排列,使得每个排列为 3 <= x <= len(my_list)长。

第 2 步:

循环列表,如果找到正则表达式匹配,则将该元素拉出并将其放入 answers 中列表。

(我并没有接受这种两步方法,这对我来说似乎是最合乎逻辑的)

我当前的代码,减去正则表达式:

    import re
from itertool import permutations

my_list = ['p', 'q', '~r', 'r', '|', '&']
foo = []
answers = []
count = 3

while count < 7:
for i in permutations(a, count):
i = ''.join(k for k in i)
foo.append(i)
count +=1

for i in foo:
if re.match(r'insert_regex', i):
answers.append(i)
else:
None
print answers

现在,我已经尝试了大量不同的正则表达式来使其工作(太多,无法在此全部列出),但其中一些主要是:

一种简单的方法,通过查找所有并排有两个字母或并排有两个运算符的案例,然后我不附加“答案”,而是将它们从“foo”中删除。这是我尝试过的正则表达式:

    r'(\w\w)[&\|]{2,}'

甚至还没有接近。

然后我决定尝试找到我想要的字符串,而不是我不想要的字符串。

我首先测试:

    r'^[~\w]'

以确保我可以获得第一个字符是字母或否定的字符串。这有效。我很高兴。

然后我尝试了:

    r'^[~\w][&\|]'

尝试获取下一个逻辑运算符;但是,它只选取第一个字符为字母的字符串,并忽略所有第一个字符为否定的字符串。

然后我尝试了一个条件,如果第一个字符是否定,则下一个字符将是一个字母,否则它将是一个运算符:

    r'^(?(~)\w|[&\|])'

但这给我带来了“错误:组名中的错误字符”。

然后我尝试通过以下方式解决此错误:

    r'^(?:(~)\w|[&\|])'

但只返回以“~”或运算符开头的字符串。

然后我尝试了一系列与条件和分组相关的其他事情(实际上花了 2 天),但我似乎找不到解决方案。部分问题是我对正则表达式了解不够,不知道去哪里找到解决方案,所以我一直在互联网上漫无目的地闲逛。

我已经浏览了很多教程和解释页面,但它们都相当不透明,并且没有以有利于理解的方式将内容组合在一起......它们只是抛出代码供您复制和使用粘贴或模仿。

如果您有任何见解,我们将不胜感激,尽管我非常希望得到问题的答案,但如果可能的话,对解决方案的作用进行 ELI5 解释对于我自己的进步将非常有帮助。

最佳答案

讽刺的是,事实证明我已经写下了解决方案(我记录了我尝试过的所有正则表达式),但它最初失败了,因为我忘记从原始列表中删除字符串,而不是副本。

如果有人正在寻找问题的解决方案,以下代码适用于我的所有测试用例(但是不能保证除此之外)。

    import re
from itertools import permutations
import copy

a = ['p', 'q', 'r', '~r', '|', '&']
foo = []
count = 3

while count < len(a)+1:
for j in permutations(a, count):
j = ''.join(k for k in j)
foo.append(j)
count +=1

foo_copy = copy.copy(foo)

for i in foo:
if re.search(r'(^[&\|])|(\w\w)|(\w~)|([&\|][&\|])|([&\|]$)', i):
foo_copy.remove(i)
else:
None

print foo_copy

关于python - 从变量和运算符的排列生成表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090774/

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