我试着用文字玩。例如,我读了" 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
答案 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的方式并将替换放在代码
中所以我可以在代码中添加替换但是如何解决重复项?