gpt4 book ai didi

javascript - 长度为 5 的 Python 3.3 itertools 映射按正则表达式级别过滤

转载 作者:行者123 更新时间:2023-11-29 22:07:24 25 4
gpt4 key购买 nike

免责声明:您好,这是我在 stackoverflow 上发表的第一篇文章,尽管我已经在这个宝贵的网站潜伏了好几个月。如果我在这篇文章中违反了任何程序/犯下了愚蠢的行为,请告诉我。

总结:我正在尝试做的是使用 python 中的 map 函数为长度为 5 的正则表达式集 [A-Za-z0-9] 模拟所有可能的字符串。此外,每个级别都有一个额外的正则表达式来过滤掉可能的答案,因此最终级别应该只产生 1 个字符串。我应该注意到我试图找到的是这些正则表达式的 1 个答案。请注意,这是一个最初在 javascript 中的谜题,所以如果有什么地方看起来不对劲,我很可能翻译得不好。

问题: 我在 level2 的 print 语句中添加了 added,它返回空括号。对于我所写的,这不应该是可能的。有人可以解释我做错了什么吗?此外,itertools 映射是查找此字符串/映射这些正则表达式的计算密集型过程,我对其他可能的方法持开放态度。感谢您的宝贵时间。

** 已编辑 ** 格式。

import re
import itertools
import string
for s in map(''.join, itertools.product((string.ascii_letters + string.digits), repeat=5)):
rexp = re.compile("^[A-Za-z0-9]{5}")
matches = re.findall(rexp, s)
#LEVEL 1
if len(matches) !=0:
rexp = re.compile("^[^e-z0-9A-Z]+[^A-Z]{4}{?[a-z]*_?")
matches = re.findall(rexp, s)
#LEVEL 2
if len(matches) !=0:
rexp = re.compile("^[A9FbdHh5]+[T]*.{2}_?[a-z]+")
matches = re.findall(rexp, s)
print("Level 2 Match Found: ", matches)
#LEVEL 3
if len(matches) !=0:
rexp = re.compile("^YdSeu][r]+[^r]+=?_?[aeiou]+[^pstuvwxyz]+")
matches = re.findall(rexp, s)
#LEVEL 4
if len(matches) !=0:
rexp = re.compile("^(c|a|b|d)+
[^A-Za-df-qs-z]{2}{?[^vCXBhq]*[^pqrst]*[a]+[^passwd]*}")
matches = re.findall(rexp, s)
#LEVEL 5
if len(matches) !=0:
rexp = re.compile("^.*[k0pst]$")
matches = re.findall(rexp, s)
#LEVEL 6
if len(matches) !=0:
rexp = re.compile("^[^0-9A-Z]{5}$")
matches = re.findall(rexp, s)
print("Password Found: ", matches)
print("\n")
print("\n")
print("\n")
input('Press ENTER to exit')

最佳答案

我不知道您要做什么...但让我们回到基础。您正在定义一个包含 62 个项目的 Universe:

universe = string.ascii_letters + string.digits

然后您要尝试取其中 5 个宇宙的叉积,这意味着大约十亿种组合:

62 ** 5 = 916,132,832

不仅如此……您还想将这十亿个东西实例化为一个列表。

map(''.join, itertools.product(universe, repeat=5))

itertools.product 的目的之一是避免提前(在内存中)计算所有组合。所以我们可以像这样重写你的顶级代码:

n_repeat = 5
for xs in itertools.product(universe, repeat = n_repeat):
s = ''.join(xs)

其他几点:

  • 如果您编写的代码必须迭代十亿个项目,您不希望重复计算。因此,在开始大循环之前,请提前编译所有正则表达式。

  • 同时,将这些正则表达式重写为可参数化,这样您的代码就可以使用较小的 N(小于 5)作为重复值。否则,您将无法在解决算法中的问题时快速迭代。

  • 当您的正则表达式始终锚定在字符串的开头时,您为什么要使用 findall()?请改用 search() 甚至 match()

  • 您的第一个和最后一个正则表达式毫无用处。根据定义,他们将永远成功。

  • 拥有一种既可以测试通用正则表达式(例如,级别 1 或级别 6)又可以测试非常具体的正则表达式(例如,级别 4)的算法是没有意义的。只需测试特定要求并完成它。

  • 您的正则表达式似乎不兼容。字符串如何以此开头:^(c|a|b|d)。还有这个:^Y

关于javascript - 长度为 5 的 Python 3.3 itertools 映射按正则表达式级别过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157172/

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