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

时间:2012-06-25 01:29:09

标签: python iteration combinations

我希望它是星期一 - 它现在正在踢它,但我觉得应该非常容易 - 或者至少是优雅 - 给我一个大脑放屁。用例是这样的:

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

字:'密码' 组合:'PASSWORD','P @ ssw0rd','p @ 55w0rD'......

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

4 个答案:

答案 0 :(得分:5)

import itertools

places = [
    "Pp",
    "Aa@",
    "Ss5",
    "Ss5",
    "Ww",
    "Oo0",
    "Rr",
    "Dd",
]

for letters in itertools.product(*places):
    print "".join(letters)

如果你需要处理任意单词,那么你需要编写代码来从字符串中创建places列表。

答案 1 :(得分:3)

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

{ 'A':[ '一个', 'A', '@'],..., 'S':[ 'S', 'S', '5'],...,} < / p>

一旦你的词典被构建,其余的只是一个简单的笛卡尔积的不同列表的正确顺序的问题。

答案 2 :(得分:2)

我使用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()])

答案 3 :(得分:1)

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

如果您对asterisk *的含义感到好奇,请点击此处:foggy on asterisk in python