用Python替换字符串中的字符

时间:2014-06-05 13:29:58

标签: python string replace cryptography character

为一项任务工作一个简单的(非常简单,可笑的弱)加密程序,无论我采用哪种方式,我似乎都遇到了同样的错误。

 def cryptofied(text, dic):
    for i, j in dic.items():
            text = text.replace(i, j)
    return text
编辑:现在正在使用      def cryptofied(text,dic):         ret =""         for p in range(len(text)):                 ret + = dic [text [p]]         返回

def encode(codedMsg):
    print(codedMsg, '   Here was your message to be encoded.')
    lock = {'A':'X', 'B':'P', 'C':'M', 'D':'G', 'E':'T', 'F':'D', 'G':'H', 'H':'L', 'I':'Y', 'J':'O', 'K':'N', 'L':'Z', 'M':'B', 'N':'W', 'O':'E', 'P':'A', 'Q':'R', 'R':'K', 'S':'J', 'T':'U', 'U':'F', 'V':'S', 'W':'C', 'X':'I', 'Y':'Q', 'Z':'V'}
    codedMsgTest = cryptofied(codedMsg, lock)
    print(codedMsgTest, 'here is your coded message')

然而,当我输入时,例如" frank"作为编码的Msg,它将在#G; GKXCC"中吐出,这显然是不正确的。据我所知,问题是它正在改变" K"到" N",然后改变" N"的两个实例。进入" C"。我该怎么做才能消除这种情况?

编辑: 所以,现在这个代码的问题是,如果使用的字符不在我的锁中,则会出现错误。我该如何忽略这些字符?

3 个答案:

答案 0 :(得分:5)

您可以使用索引迭代单词,然后依次修改它们,如下所示:

for i in xrange(len(text)):
    text[i] = dic[text[i]]

但是there is a method called maketrans(), which allows you to do exactly this

import string
s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s2 = "XPMGTDHLYONZBWEARKJUFSCIQV"
trans = string.maketrans(s1,s2)
strtrans = "THIS IS A SAMPLE PROGRAM FOR MAKETRANS"
outstr = strtrans.translate(trans)
print outstr      # ULYJ YJ X JXBAZT AKEHKXB DEK BXNTUKXWJ

答案 1 :(得分:1)

这是因为text.replace(i, j) i的所有匹配进行操作。

而不是遍历字典

for i, j in dic.items():
        text = text.replace(i, j)

你需要迭代输入词中的位置

ret = ""
for p in range(len(text)):
        ret += dic[text[p]]
return ret

答案 2 :(得分:0)

您可以遍历字符串本身:

>>> lock = {'A':'X', 'B':'P', 'C':'M', 'D':'G', 'E':'T', 'F':'D', 'G':'H', 'H':'L', 'I':'Y', 'J':'O', 'K':'N', 'L':'Z', 'M':'B', 'N':'W', 'O':'E', 'P':'A', 'Q':'R', 'R':'K', 'S':'J', 'T':'U', 'U':'F', 'V':'S', 'W':'C', 'X':'I', 'Y':'Q', 'Z':'V'}
>>> text = "FRANK"
>>> encrypted_text = ""
>>> for char in text:
...     encrypted_text += lock.get(char)
... 
>>> encrypted_text
'DKXWN'
>>>