在python中查找单词的所有组合(上下和符号)



我希望现在是星期一 - 它目前正在发挥作用,但我觉得应该很容易 - 或者至少优雅 - 让我放屁。用例是这样的:

查找特定单词的所有可能组合,其中字母可以是任何大小写或替换为字母。例如:

单词:"密码"组合:"密码","P@ssw0rd","p@55w0rD"...

我不想写 7 个循环来找出答案,即使它是一个我们永远不会再使用的脚本。

import itertools
places = [
    "Pp",
    "Aa@",
    "Ss5",
    "Ss5",
    "Ww",
    "Oo0",
    "Rr",
    "Dd",
]
for letters in itertools.product(*places):
    print "".join(letters)

如果需要处理任意单词,则需要编写代码以从字符串创建places列表。

这个问题的主要问题是并非所有字母都可以转换为符号或数字。您必须创建一个字典,其中键是小写字母,值是该字母的所有可能替换的列表:

{'a':['a','

A','@'],...,'s':['s','S','5'],...,}

一旦你的字典建成了,剩下的只是以正确的顺序对不同列表的简单笛卡尔乘积的问题。

我会使用itertools.product

import itertools
symbols = dict(a="@", s="5", o="0")  # char -> str
text = "password"
print list(itertools.product(*[[letter, letter.upper()] + list(symbols.get(letter, "")) for letter in text.lower()])

itertools.product 就是您要搜索的内容:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from itertools import product
def getAllCombinations(password):
    leet = ["Aa@","Bb","Cc", "Dd","Ee","Ff","Gg","Hh","Ii","Jj","Kk",
            "Ll","Mm","Nn","Oo0","Pp","Qq","Rr","Ss5","Tt","Uu","Vv",
            "Ww","Xx","Yy","Zz"]
    getPlaces = lambda password: [leet[ord(el.upper()) - 65] for el in password]
    for letters in product(*getPlaces(password)):
        yield "".join(letters)
for el in getAllCombinations("Password"):
    print el

如果你好奇星号*是什么意思,你在这里:python中星号上的雾

最新更新