同时更换字符串的部分内容

时间:2013-08-11 18:38:11

标签: python replace

我正在尝试在python中创建一个“加密器”,通过“密钥”文件更改字符串中的所有内容。

代码:

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
alphabet = list(alphabet)
cryptkey = open("cryptkey", "r")
key = cryptkey.read(36)

text = list(key)
tocrypt = open("tocrypt.txt", "r")    
tocryptvar = tocrypt.read()
tocryptvar = tocryptvar.lower()
################################################    Replacement
tocryptvar = tocryptvar.replace("a", key[0]).replace("b", key[1]).replace("c", key[2]) #etc

关键是字母和数字混洗并放入文件中。 所以,我的问题是,当说,A被替换为B表示一切都好但是然后它改变B说G,然后A变成了G。就是这样。

4 个答案:

答案 0 :(得分:3)

更好的方法是将密钥设置为字典,然后通过循环替换纯文本:

key = {}
key['a'] = '4' # here '4' is your replacement

plain = 'hello there'
cryptext = ''.join(key[i] for i in plain)

这是一种快速测试方法

import string
import random

letters = list(string.ascii_letters+string.digits)
random.shuffle(letters)

# This creates a random key for each letter, a simple
# substitution
key = {v:letters[i] for i,v in enumerate(string.ascii_letters+string.digits)}

plain_string = 'hello world'
cryptext = ''.join(key.get(i,i) for i in plain_string)

此处的输出类似于'fLXXc ocMXg'

顺便说一句,string.ascii_letters是整个字母(包括大写字母),string.digits是数字0到9

答案 1 :(得分:1)

这应该可以解决问题:

import string as str_module

alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
key = None
with open("cryptkey", "r") as f:
    key = f.read(36)

tocryptvar = None
with open("tocrypt.txt", "r") as f:
    tocryptvar = f.read().lower()

trans_table = str_module.maketrans(alphabet, key)

tocryptvar = tocryptvar.translate(trans_table)

alphabet是要使用密钥翻译的字符串,key是一串字符,将alphabet中对应的字符翻译成字符。 string.maketrans()创建了从alphabetkey的翻译字符串,tocryptvar.translate(trans_table)使用翻译表翻译字符串(不在alphabet中的字符保持不变)。

答案 2 :(得分:0)

您可以简单地遍历字符串的每个字符,并用它们的替换单独替换它们。

答案 3 :(得分:0)

alphabet = list("abcdefghijklmnopqrstuvwxyz0123456789")
key = list(open("cryptkey", "r").read(36))
mapping=dict(zip(alphabet,key))

tocryptvar = open("tocrypt.txt", "r").read().lower()
cryptedval=''.join([mapping[k] for k in tocryptvar])