Python - как генерировать список слов из заданных символов определенной длины
Я хочу выполнить атаку по словарю, и для этого мне нужны списки слов. Как создать список слов из заданных символов определенной длины (или длины слова от минимальной длины до максимальной длины)? я пытался itertools.combinations_with_replacements
а также itertools.permutations
, но это не помогает. У них нет всех списков слов, которые он должен вернуть. Любая помощь будет оценена. Спасибо.
4 ответа
Использование itertools.product
:
>>> import itertools
>>>
>>> chrs = 'abc'
>>> n = 2
>>>
>>> for xs in itertools.product(chrs, repeat=n):
... print ''.join(xs)
...
aa
ab
ac
ba
bb
bc
ca
cb
cc
Чтобы получить слово от минимальной длины до максимальной длины:
chrs = 'abc'
min_length, max_length = 2, 5
for n in range(min_length, max_length+1):
for xs in itertools.product(chrs, repeat=n):
print ''.join(xs)
Это наивная реализация:
list='abcdefg'
depth=8
def generate(l,d):
if d<1:
return
for c in l:
if d==1:
yield c
else:
for k in generate(l,d-1):
yield c+k
for d in range(1,depth):
for c in generate(list,d):
print c
У меня пока недостаточно репутации, чтобы комментировать, поэтому, чтобы составить полный список на основе приведенного выше примера itertools:
import itertools
chrs='abc'
n=6
for i in range(1,n):
for xs in itertools.product(chrs, repeat=i):
print ''.join(xs)
Таким образом, в вашем списке есть все слова длиной от 1 до n.
from itertools import product
def allwords(chars, length):
for letters in product(chars, repeat=length):
yield ''.join(letters)
def main():
letters = "abc"
for wordlen in range(3, 5):
for word in allwords(letters, wordlen):
print(word)
if __name__=="__main__":
main()
возвращается
aaa
aab
aac
aba
abb
...
ccbc
ccca
cccb
cccc
def word_gen(start= 3,end= 3, elements = 1): """ Hud Seidu Daannaa Wordlist gen MSC InfoSec, CEH"
README
#for start&end
#e.g. start= 3,end= 3
#means first words to last words should be 3 characters
#for elements
1 is asci
2 is numbers
3 is asci&numbers
"""
import itertools
#types of elements
if elements ==1: elements= 'abcdefghijklmnopqrstuvwxyx'
if elements ==2: elements= '0123456789'
if elements== 3: elements= 'abcdefghijklmnopqrstuvwxyx0123456789'
else: pass
wl = []
for i in range(start,end+1):
for xs in itertools.product(elements, repeat=i):
wl.append(''.join(xs))
return wl