【问题标题】:Recognizing dictionary words in a string识别字符串中的字典单词
【发布时间】:2016-03-04 16:56:59
【问题描述】:

我正在编写一个程序来评估密码的强度。我的程序中的一个函数获取输入的密码,并将其与大量单词和密码列表进行比较。

这段代码是一个二进制搜索,查看输入的密码是否在密码列表中。

with io.open('PasswordList.txt', encoding='latin-1') as myfile:
        data = myfile.readlines()
        low = 0
        high = (len(data)-1)
        while (low <= high) and not Found:
            mid = int((low+high)/2)
            if data[mid].rstrip() == Password:
                Found = True
                break
            elif Password < str(data[mid]):
                high = mid - 1
            elif Password > str(data[mid]):
                low = mid + 1

这段代码从密码中删除所有数字,将其转换为常用字母,并再次对照列表进行检查。 “Password123”会变成“password”,而“password”在列表中。

SimplePassword = ''.join([i for i in Password if not i.isdigit()])
SimplePassword = SimplePassword.lower()

if not Found:
        with io.open('final.txt', encoding='latin-1') as myfile:
            data = myfile.readlines()
            low = 0
            high = (len(data)-1)
            while (low <= high) and not Found:
                mid = int((low+high)/2)
                if data[mid].rstrip() == SimplePassword:
                    PartiallyFound = True
                    break
                elif SimplePassword < str(data[mid]):
                    high = mid - 1
                elif SimplePassword > str(data[mid]):
                    low = mid + 1

我想通过编写一些可以识别字符串中的名称或单词的代码来进一步实现这一点。例如,单词“john”在列表中,单词“smith”在列表中。但是,输入的密码“JohnSmith123”会被忽视。

如何才能将字符串拆分为单独的单词?我正在考虑的一种方法是将大写字母之间的字母附加到数组中,然后单独检查该数组中的每个元素。

但必须有更好的方法。有什么方法可以查看输入的密码是否可以从大型单词列表中的单词变体构造?

【问题讨论】:

标签: python regex string search


【解决方案1】:

你可以测试一下

badness = 0
for word in wordlist:
    if word in passwordString and len(word) > badness:
        badness = len(word)

这样,密码这个词就会被:

  • 密码
  • 通过

但实际上只有“密码”才适用。

【讨论】:

  • @Kos:我刚刚编辑了他的答案以将其转换为 Python。
  • 是的。如果它找到与整个密码的某个百分比匹配的单词,您可以添加逻辑以使其停止。那会加快一点。但是如果你想查看密码中是否有任何单词,那将需要一些时间......
  • @Kos - 想象一个拼写检查器,每次您输入一个字母时都会检查 130,000 个单词。使用我的链接中的三叉树正则表达式生成器。或者,给我你的数据,我会为你生成一个。
  • @Kos - 见过 175,000 字的三元树字典正则表达式吗? here it is。快如闪电。
  • 这是一个巨大的表达。我没有使用您的工具创建正则表达式的窗口。我会把我的数据发给你
【解决方案2】:

from variations of words inside a large wordlist

您可以使用一个工具从您的
构造一个正则表达式Trie 单词列表。
您只需将所有变体粘贴到文本框中,它就会抽出
一个完整的正则表达式树。

这可能是最快的查找。

该工具在试用版中可用。

屏幕截图Tool
App 仅在 Windows 上运行。

主菜单的位置是工具->三叉树

基准测试

Regex used
Samples

Regex1:
Completed iterations:   1  /  1     ( x 1000 )
Matches found per iteration:   174939
Elapsed Time:    600.30 s,   600296.36 ms,   600296365 µs

目标样本:正则表达式表示的所有 174,939 个单词(按随机顺序)

样本分析:

    174,939  words matched / iteration
  x   1,000  iterations
------------------------------
 174,939,000 total words matched
  /      600 total seconds
------------------------------
     291,565 words matched / second         <<<
  /    1,000 miliseconds / second
------------------------------
         292 words matched / milisecond     <<<

【讨论】:

  • @Kos - 借一台电脑。或者给我一个链接到你的单词/字符串,我会为你做一个。
  • 其实使用表达式很简单。这只是一个正则表达式。您可以使其不区分大小写、使用边界、将其放入断言中,或者您需要使用它。诀窍是在程序启动时只编译一次。然后你就可以一遍又一遍地使用它来进行搜索或匹配。
  • @Kos - 看起来像是电话簿中的大约 1000 万个姓氏。无论如何..正则表达式是HERE。快把它们取下来,因为它们很快就会被删除。 FT0001-FT0048 .rxf 扩展名是正则表达式文件。 .txt 扩展名是分解的文本部分 @ 2.5 MB/ea。 .rx.txt 是转换为正则表达式 @ 900KB/ea 的部分。 total 由 48 个独立的正则表达式组成。试一试,看看 Python 是否会采用这种大小的正则表达式。如果是这样,您在启动时创建 48 个单独的编译正则表达式。使用密码上的每个正则表达式执行 for 循环。
  • 您真的只需要 FT0001-FT0048 .rx.txt 文件。
  • @Kos - 我之前试图告诉你,该工具是非常可定制的。我只是做了一个不区分大小写的一般情况,并围绕整个事情进行分组(?I)(?:...) 还有一个通配符选项。但是,是的,它会匹配任何形式的 horseHor$e 是一个排列。我之前说过,包括所有排列。另外,我没有添加任何边界条件,所以如果那是字符串,它将匹配 555HoRse999。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2019-04-26
  • 2014-01-03
  • 2018-05-01
  • 2014-06-09
相关资源
最近更新 更多