0

私は辞書攻撃を実行することを検討しており、文字 af と 2-9 の 10 文字ごとの順列を含む単語リストを作成する方法を知りたいです (私が行うことができます) すべての単語に 5 文字 (af) と 5 数字が含まれている場合(2-9) または 6 文字 (af) と 4 つの数字 (2-9) のみ (私にはできないこと)。

これが私がこれまでに持っているものです(ここから):

import itertools

chrs = 'abcdef23456789'
n = 2

min_length, max_length = 10, 10

for n in range(min_length, max_length+1):
    for xs in itertools.product(chrs, repeat=n):
        print ''.join(xs)

ありがとう

4

3 に答える 3

0

文字列内の有効な文字と数字の数を返す関数を作成し、戻り値をテストするだけです。

nums = '23456789'
chars = 'abcdef'

def letter_number_count(word):
    l,n = 0,0
    if len(word) == 10:
        for c in word:
            if c in nums:
                n += 1
            elif c in chars:
                l += 1
    return l,n

テスト出力

>>> s = 'abcdef2345'
>>> (l,n) = letter_number_count(s)
>>> if (l,n) == (6,4) or (l,n) == (5,5):
...     print "Do something"
... 
Do something
>>> 
于 2015-10-11T20:38:08.053 に答える
0

これにより、合計数 n から 20 の順列が出力されます。n = 10 (10! = 3,628,800)

import itertools as it
print(list(map(''.join,it.islice(it.permutations('abcdef23456'), 20))))

['abcdef2345', 'abcdef2346', 'abcdef2354', 'abcdef2356', 'abcdef2364', 'abcdef2365', 'abcdef2435', 'abcdef2436', 'abcdef2453', 'abcdef2456', 'abcdef2463', 'abcdef2465', 'abcdef2534', 'abcdef2536', 'abcdef2543', 'abcdef2546', 'abcdef2563', 'abcdef2564', 'abcdef2634', 'abcdef2635']
于 2015-10-11T20:45:15.747 に答える
0

各順列を個別にチェックし、条件を満たす場合は配列に追加することができます。各関数の数字と文字を数え、条件をチェックする単純なブール関数を書くだけです。

于 2015-10-11T20:40:23.433 に答える