这就是我现在所处的位置:
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
我想通过章程替换掉字符,这就是我将字符串传递给数组的原因。这是解决这个问题的正确方法吗?
答案 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']