如果字符串中的字符与哈希表匹配并循环播放,则替换字符串中的字符

时间:2018-03-20 17:39:00

标签: python python-3.x

这就是我现在所处的位置:

CharList = []
text = "xxxxAAaaaSSSxxx"
PasswordSubHT = {"a":"@" , "A":"4" , "S":"5"}
for LETTER in text:
    CharList.append(LETTER)
for EL in CharList:
    if EL in PasswordSubHT:
        print(text.replace(EL,str(PasswordSubHT[EL])))

这就是我得到的:

xxxx44aaaSSSxxx
xxxx44aaaSSSxxx
xxxxAA@@@SSSxxx
xxxxAA@@@SSSxxx
xxxxAA@@@SSSxxx
xxxxAAaaa555xxx
xxxxAAaaa555xxx
xxxxAAaaa555xxx

这就是我想要的:

xxxx4AaaaSSSxxx
xxxx44aaaSSSxxx
xxxxAA@aaSSSxxx
xxxxAA@@aSSSxxx
xxxxAA@@@SSSxxx

我想通过章程替换掉字符,这就是我将字符串传递给数组的原因。这是解决这个问题的正确方法吗?

4 个答案:

答案 0 :(得分:2)

Python string replace方法用字符串中的新字母替换字母的所有实例。例如,在第一遍中,它跳过所有字母直到A,然后看到A在子列表中并用字符串替换字符串中A的所有INSTANCES。然后它移动到下一个字符,此时该字符变为4代替。 Python字符串是不可变的。所以你不能真正接他们并改变他们之间的信件。 您可以做的是将此字符串转换为列表。 char_list = list(text)。然后你可以迭代这个并保留一个计数器。

for char in char_list:
   counter = counter + 1
   if char in PassSubList:
      char_list[counter] = PassSubList[char]
 return_list = ''.join(char_list)

答案 1 :(得分:1)

检查一下,让我知道:

text = "xxxxAAaaaSSSxxx"
PasswordSubHT = {"a":"@" , "A":"4" , "S":"5"}

for letter in text:
    if letter in PasswordSubHT.keys():
        text = text.replace(letter, str(PasswordSubHT[letter]))
        print(text)

注意:
replace(x, y)将替换文本中的所有x。如果您想在此时只替换一个字符,请添加count参数= 1:text = text.replace(letter, str(PasswordSubHT[letter]), 1)

答案 2 :(得分:1)

在回答你的问题之前,你需要了解一些关于Python字符串的重要事项,即它们是不可变的。

正如Data Model文件建议:

  

某些对象的值可能会发生变化。值可以改变的对象被认为是可变的;一旦创建它们的值不可更改的对象称为不可变。

因此,您不能只使用replace method,但必须将新字符串重新分配到text字符串中。

所以这一部分:

print(text.replace(EL,str(PasswordSubHT[EL])))

将是:

text = text.replace(LETTER, PasswordSubHT[LETTER], 1)
print(text)

您不必遍历字符串以将其分配给列表,而只是循环遍历字符串本身并检查您想要的条件。

根据replace方法doc。您可以通过提供maxreplace参数来指定允许替换的字符数。所以你需要的是:

CharList = []
text = "xxxxAAaaaSSSxxx"
PasswordSubHT = {"a":"@" , "A":"4" , "S":"5"}
for LETTER in text:
    if LETTER in PasswordSubHT.keys():
        # Note: Check the new max character argument.
        text = text.replace(LETTER, PasswordSubHT[LETTER], 1)
        print(text)

答案 3 :(得分:1)

您可以使用正则表达式:

import re
text = "xxxxAAaaaSSSxxx"
PasswordSubHT = {"a":"@" , "A":"4"}
combos = {a:iter([b*i for i in range(1, len(re.findall(a, text))+1)]) for a, b in PasswordSubHT.items()}
new_results = [[re.sub('{}+'.format(i), next(combos[i[0]])+i[c:], text) for c, i in enumerate(b)] for b in re.findall('|'.join(map(lambda x:'{}+'.format(x), PasswordSubHT.keys())), text)]
final_results = [i for b in new_results for i in b]

输出:

['xxxx4AaaaSSSxxx', 'xxxx44aaaSSSxxx', 'xxxxAA@aSSSxxx', 'xxxxAA@@SSSxxx', 'xxxxAA@@@SSSxxx']