我希望這是星期一itis踢在這一刻,但我覺得應該很容易 - 或者至少是優雅 - 給我一個腦屁。用例如下:查找python中一個單詞的所有組合(上下和符號)
查找特定單詞的所有可能組合,其中字母可以是任意大小寫或用字母替換。例如:
字: '密碼' 組合: '密碼', 'P @ ssw0rd', 'P @ 55w0rD' ......
我不想寫7個循環,以發現這一點,即使這是一次性的腳本,我們永遠不會再使用。
我希望這是星期一itis踢在這一刻,但我覺得應該很容易 - 或者至少是優雅 - 給我一個腦屁。用例如下:查找python中一個單詞的所有組合(上下和符號)
查找特定單詞的所有可能組合,其中字母可以是任意大小寫或用字母替換。例如:
字: '密碼' 組合: '密碼', 'P @ ssw0rd', 'P @ 55w0rD' ......
我不想寫7個循環,以發現這一點,即使這是一次性的腳本,我們永遠不會再使用。
import itertools
places = [
"Pp",
"[email protected]",
"Ss5",
"Ss5",
"Ww",
"Oo0",
"Rr",
"Dd",
]
for letters in itertools.product(*places):
print "".join(letters)
如果您需要處理任意話,那麼你就需要編寫代碼來創建從字符串places
列表。
我會使用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()])
的主要問題這個問題,是不是所有的字母可以轉換爲符號或數字。您必須創建一個字典,其中的密鑰是小寫字母,值是該字母的所有可能替換的列表:
{'a':['a','A','@'] ,...,'s':['s','S','5'],...,}
一旦你的字典被構建,其餘的只是一個簡單的Cartesian乘積正確順序的不同列表。
itertools.product是你搜索的內容:如果你是好奇的asterisk *手段,在這裏你是什麼
#!/usr/bin/python
# -*- coding: utf-8 -*-
from itertools import product
def getAllCombinations(password):
leet = ["[email protected]","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
我試過'itertools.product',但沒有意識到它可能需要幾次迭代。我知道這很簡單,謝謝。 –