先日、sedとブレース展開を用いて文字列の大文字・小文字・Leet変換全ての組み合わせを取得するという処理についてやったが、今回は同じようなことをPythonでやるにはどうすればいいか調べてみた。 Pythonでは、itertoolsというモジュールを使うことで、この組み合わせを簡単に生成できるようだ。

以下のように、組み合わせとなる文字列をリストに入れておき、それを利用することでリストが取得できる。

leetlist.py
#!/usr/bin/python # -*- coding: utf-8 -*- import sys from itertools import product def getLeetList(string): leet = ["Aa@", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii1", "Jj", "Kk", "Ll1", "Mm", "Nn", "Oo0", "Pp", "Qq9", "Rr", "Ss$5", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz2"] getPlaces = lambda string: [leet[ord(el.upper()) - 65] for el in string] for letters in product(*getPlaces(string)): yield "".join(letters) input_line = sys.stdin.readlines() for line in input_line: for s in getLeetList(line.rstrip('\n')): print s

blacknon@BS-PUB-DEVELOP:~$ echo -e "abc\ndef" | ./leetlist.py
ABC
ABc
AbC
Abc
aBC
aBc
abC
abc
@BC
@Bc
@bC
@bc
DEF
DEf
DeF
Def
dEF
dEf
deF
def