【问题标题】:Replacing a letter with "#" and reverse用“#”替换字母并反转
【发布时间】:2021-10-24 06:26:59
【问题描述】:

我是 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>

我想知道为什么它没有显示任何代码问题。也许有更简单的方法可以实现这一点?

【问题讨论】:

    标签: python html django


    【解决方案1】:

    我并没有完全按照您在此处尝试执行的操作,但您在 decrypted 函数中的第一个 replace 调用将查找并替换每个出现的“#”。每个“加密字母”中都有字母“a”,而不仅仅是“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 }) 
    

    【讨论】:

      【解决方案2】:

      拥有许多与您和其他答案相似的代码行,您应该考虑如何通过算法处理此问题。

      假设您只关心对小写 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 可能是一个不错的选择

      【讨论】:

        【解决方案3】:

        它不起作用的原因是a的编码是b,c,d,e等的子字符串。

        a = #.
        b = ##.
        c = ###.
        

        如您所见,#. 位于每个编码字符串的末尾

        所以当你第一次编码时,假设abc 它变成#.##.###. 当您运行使用replace("#.", "a") 的解码步骤时,您会得到a#a##a 的结果,其中每个#. 都被a 替换,并且您可以看到没有剩下的点。

        解决方法很简单,不用###.格式,使用.###.格式

        a = .#.
        b = .##.
        c = .###.
        

        这将确保只有正确数量的 # 匹配,而不是子字符串。

        所以当你第一次编码时,假设abc它变成.#..##..###. 当您运行使用replace(".#.", "a") 的解码步骤时,您会得到a.##..###. 的结果,因为您可以看到b 和c 的代码仍然存在。

        顺便说一句,您可以使用循环来使代码更小。

        【讨论】:

        • 非常感谢!这解决了问题!
        【解决方案4】:

        不是专家,但你可以试试

        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})
        

        【讨论】:

          猜你喜欢
          • 2017-05-16
          • 2017-11-05
          • 2016-12-22
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 2012-06-24
          • 2012-11-10
          • 2021-10-14
          相关资源
          最近更新 更多