我是python新手,正在编写一个测试程序,将给定文本中的所有字母替换为符号。
def encrypted(request):
text = request.GET['text']
text = text.replace("a", "#.")
text = text.replace("b", "##.")
text = text.replace("c", "###.")
text = text.replace("d", "####.")
text = text.replace("e", "#####.")
text = text.replace("f", "######.")
etc...
return render(request, 'encrypted.html', {'text': text})
我已经做到了,但我试着用同样的方法逆转它,它不起作用。
def decrypted(request):
ftext = request.GET['text']
ftext = ftext.replace("#.", "a")
ftext = ftext.replace("##.", "b")
ftext = ftext.replace("###.", "c")
ftext = ftext.replace("####.", "d")
ftext = ftext.replace("#####.", "e")
etc...
return render(request, 'decrypted.html')
所以文本根本不会出现在页面上。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>yCrypt</title>
</head>
<body>
TEXT DECRYPTION: {{ftext}}
</body>
</html>
我想知道为什么它没有显示任何代码问题。也许有一种更简单的方法可以做到这一点?
我不完全遵循您在这里尝试做的事情,但是您在decrypted
函数中的第一个replace
调用将查找并替换每次出现的"#."加上字母& & &;在每个"加密字母"中,不只是"&;a&;"。
对replace
的后续调用将不匹配任何内容,因为它们的尾部"#."已被错误地替换为字母"a"
要按设计工作,您必须颠倒replace
调用的顺序,以便首先找到最长的匹配。
要渲染它,你还必须在上下文中将它传递给模板渲染器。
def decrypted(request):
ftext = request.GET['text']
etc...
ftext = ftext.replace("#####.", "e")
ftext = ftext.replace("####.", "d")
ftext = ftext.replace("###.", "c")
ftext = ftext.replace("##.", "b")
ftext = ftext.replace("#.", "a")
return render(request, 'decrypted.html', { "ftext": ftext })
不工作的原因是a的编码是b, c, d, e等的子字符串。
a = #.
b = ##.
c = ###.
如你所见,#.
位于每个编码字符串
的末尾所以当你第一次编码时,假设abc
变成了#.##.###.
当你运行解码步骤时,你使用replace("#.", "a")
,你得到结果a#a##a
,其中每个#.
被a
取代,正如你所看到的,没有点留下。
解决方案很简单,不用###.
格式,用.###.
格式
a = .#.
b = .##.
c = .###.
这将只确保#
匹配的正确数量,而不是子字符串。
所以当你第一次编码时,比如abc
,它变成了.#..##..###.
当你运行解码步骤时,你使用replace(".#.", "a")
,你会得到a.##..###.
的结果,因为你可以看到b和c的代码仍然在那里。
顺便说一句,你可以使用循环来使代码更小。
我不是专家,但你可以试试
def decrypted(request):
ftext = request.GET['text']
ftext = ftext.replace("#.", "a")
ftext = ftext.replace("##.", "b")
ftext = ftext.replace("###.", "c")
ftext = ftext.replace("####.", "d")
ftext = ftext.replace("#####.", "e")
return render(request, 'decrypted.html',{'ftext':ftext})
如果有很多类似的代码行,那么您应该考虑如何从算法上解决这个问题。
假设您只关心编码小写ascii字母。如果是,您可以这样做:
import string
encodemap = dict()
decodemap = dict()
for i, c in enumerate(string.ascii_lowercase, 1):
pattern = '#' * i
encodemap[c] = pattern + '.'
decodemap[pattern] = c
def encode(mystring):
return ''.join([encodemap[c] for c in mystring])
def decode(mystring):
return ''.join([decodemap[p] for p in mystring.split('.')[:-1]])
ev = encode('helloworld')
print(ev)
dv = decode(ev)
print(dv)
如果你想编码其他字符,那么你只需要改变在编码&解码地图。例如:string。Printable是个不错的选择