0

今月曜日に始まることを願っていますが、私が感じる何かは非常に簡単であるか、少なくともエレガントであるはずですが、私に脳のおならを与えています。ユースケースは次のとおりです。

特定の単語の可能なすべての組み合わせを検索します。ここで、文字は任意の大文字と小文字、または文字に置き換えることができます。例えば:

単語:'パスワード'の組み合わせ:'パスワード'、'P @ ssw0rd'、'p @55w0rD'..。

これを見つけるために7つのループを記述したくありませんが、これは1回限りのスクリプトですが、二度と使用することはありません。

4

4 に答える 4

5
import itertools

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

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

任意の単語を処理する必要がある場合はplaces、文字列からリストを作成するためのコードを記述する必要があります。

于 2012-06-25T01:32:41.260 に答える
3

この問題の主な問題は、すべての文字を記号や数字に変換できるわけではないということです。キーが小文字で、値がその文字のすべての可能な置換のリストである辞書を作成する必要があります。

{'a':['a'、'A'、'@']、...、's':['s'、'S'、 '5']、...、}

辞書が作成されると、残りは正しい順序でさまざまなリストの単純なデカルト積の問題になります。

于 2012-06-25T01:36:41.997 に答える
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()])
于 2012-06-25T01:36:36.837 に答える
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

アスタリスク*の意味に興味がある場合は、次のようになります。Pythonのアスタリスクが曇っている

于 2012-06-25T05:30:09.753 に答える