将字母替换为"#"并反转

  • 本文关键字:替换 python html django
  • 更新时间 :
  • 英文 :


我是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是个不错的选择

最新更新