2015-09-15 59 views
-1

我試着玩文字。例如,我從txt文件中讀取單詞「腳本」。然後想要做所有的字母突變,並寫下它們中的每一個。 因此,這裏有變化如何用python中的詞做突變?

s=$ 
s=5 
s=S 
s=s 
c=(
c=[ 
c={ 
c=< 
c=c 
c=C 
r=r 
r=R 
i=i 
i=I 
i=| 
i=1 
i=! 
. 
. 
. 

我在想什麼得到的是

scrypt 
$crypt 
5cript 
Scrypt 
s(ript 
$(cript 
. 
. 
. 

因此,所有可能的組合。類似itertool.product 我有點困惑如何做到這一點。我開始像這樣

def main(): 

    with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2: 
     for word in f1: 
      l=len(word) 
      for i in range(l): 
       if word[i] = s: 
        word1=word[i].raplace("$") #don't know if sintacs is ok 
        f2.write(word1) 
       else: 
        if word[i] = c: 
       . 
       . 

現在我很困惑這裏。我不得不要求每一個字母表中的字母,而且我正在使這個複雜化。

我可能需要在循環內部有很多循環。我覺得有多少字是多少manu for循環。


其複雜和可能放緩。有一些簡單的方法嗎?一些函數(工具)導入?

的問題是如何應對,以同一個字母一個詞,以及如何牛逼

P.S我使用python 3.4.2

回答

1

構造,每個信其允許替換映射的字典。然後使用itertools.product查找這些替換的所有組合。

import string 
import itertools 

replacements = """ 
s=$ 
s=5 
s=S 
c=(
c=[ 
c={ 
c=< 
c=C 
r=R 
i=I 
i=| 
i=1 
i=! 
""" 


d = {c:[c] for c in string.printable} 
for line in replacements.strip().split("\n"): 
    c, replacement = line.split("=") 
    d[c].append(replacement) 

word = "script" 
for letters in itertools.product(*[d[c] for c in word]): 
    print("".join(letters)) 

結果:

script 
scrIpt 
scr|pt 
scr1pt 
... 
S(R1pt 
S(R!pt 
S[ript 
S[rIpt 
... 
SCRIpt 
SCR|pt 
SCR1pt 
SCR!pt 
+0

所以我需要replacements.txt和words.txt!但是如果words.txt有兩個詞怎麼辦?或者我必須在打開txt文件後放置這個? – Difermo

+0

@Difermo我認爲這很容易,只需將輸出寫入文件並從文件中讀取替換。 –

+0

我會嘗試這個併發布,如果它的作品。它可能不會,但即時學習:D。謝謝 – Difermo

0

好吧,我寫的代碼和嘗試。我的第一個符文是這一個

import string 
import itertools 
def main(): 
     with open('mutation.txt', 'r') as l1, open('replacements.txt', 'r') as l2, open('mutator.txt', 'w') as l3: 
     d = {c:[c] for c in string.printable} 
     for line in replacements.strip().split("\n"): 
      c, replacement = line.split("=") 
      d[c].append(replacement) 

     for word in l1: 
      for letters in itertools.product(*[d[c] for c in word]): 
       l3.write("".join(letters)) 
     print("done") 
if __name__ == "__main__": main() 

而且它沒有奏效。問題在於更換。它無法閱讀或者必須以其他方式書寫。

第二次我試着把@Kevin做的替換。它只是用很多副本(重複)工作。 38字節的文件是37.4MB。刪除重複後,它下降到1.27MB。所以很多重複。該工作和有重複的代碼是這樣的一個

import string 
import itertools 
def main(): 
     replacements = """ 
     a=a 
     a=A 
     [email protected] 
     a=4 
     b=b 
     b=B 
     b=6 
     c=c 
     c=C 
     c=< 
     c={ 
     c=[ 
     d=d 
     d=D 
     e=e 
     e=E 
     e=3 
     f=f 
     f=F 
     f=% 
     f=8 
     g=g 
     g=G 
     g=9 
     h=h 
     h=H 
     h=# 
     i=i 
     i=I 
     i=! 
     i=1 
     i=| 
     j=j 
     j=J 
     j=] 
     j=> 
     j=} 
     j=) 
     k=k 
     k=K 
     l=l 
     l=L 
     l=! 
     l=1 
     l=| 
     m=m 
     m=M 
     n=n 
     n=N 
     o=o 
     o=O 
     o=0 
     p=p 
     p=P 
     r=r 
     r=R 
     s=s 
     s=S 
     s=$ 
     s=5 
     t=t 
     t=T 
     t=+ 
     t=7 
     u=u 
     u=U 
     v=v 
     v=V 
     z=z 
     z=Z 
     z=2 
     """ 
     with open('mutation.txt', 'r') as l1, open('replacements.txt', 'r') as l2, open('mutator.txt', 'w') as l3: 
     d = {c:[c] for c in string.printable} 
     for line in replacements.strip().split("\n"): 
      c, replacement = line.split("=") 
      d[c].append(replacement) 

     for word in l1: 
      for letters in itertools.product(*[d[c] for c in word]): 
       l3.write("".join(letters)) 
     print("done") 
if __name__ == "__main__": main() 

我注意到,我沒有開replacements.txt後使用L2。 所以我把這個代碼

for line in l2.strip().split("\n"): 

沒有代碼的替代品來看,它(不@Kevin方式),並沒有工作。 (這是我寫的這2個代碼的第一個代碼)。然後我用@凱文的方式,並在代碼內置換代碼

所以我很好,把替換代碼,但如何解決重複?

相關問題