如何用python中的单词进行变异?

时间:2015-09-15 14:14:27

标签: python python-3.x word mutation

我试着用文字玩。例如,我读了" script"来自txt文件。然后想做所有字母突变并写下每个字母。 所以这里有变化

 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:
                .
                .

现在我在这里感到困惑。我不得不问每个字母表中的字母,这让我很复杂。

我可能需要在循环内部有很多循环。我认为单词中有多少字符表示如何操作循环。


IT很复杂,可能会变慢。有一些简单的方法吗?一些功能(工具)要导入?

问题是如何用一个单词处理同一个字母以及如何处理

P.S我使用的是python 3.4.2

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
      a=@
      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的第一个代码)。然后我使用@kevin的方式并将替换放在代码

所以我可以在代码中添加替换但是如何解决重复项?