替换字符串中与dict中的键匹配的项目

时间:2017-06-02 16:23:10

标签: python string python-2.7 replace

我正在尝试用字典中的键替换SQL查询字符串OR NOT "[low_level_rand_num]"="[rand_num]"中的字符:

replacements = {
    '"[low_level_rand_num]"': str(random.randint(1, 13)),
    '"[rand_num]"': str(random.randint(13, 26)),
    '"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]),
    '"[rand_string]"': "asdf",
    '"[query]"': "test_col",
    '"[big_int_1]"': str(random.randint(10000000000, 99999999999)),
    '"[big_int_2]"': str(random.randint(10000000000, 99999999999)),
    '"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]),
    '"[sleeper]"': str(random.randint(3, 9))
}

使用string.replace()函数如下:

def build_payloads(template):
    replacements = {
        '"[low_level_rand_num]"': str(random.randint(1, 13)),
        '"[rand_num]"': str(random.randint(13, 26)),
        '"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]),
        '"[rand_string]"': rand_string_gen(),
        '"[query]"': random_column(),
        '"[big_int_1]"': str(random.randint(10000000000, 99999999999)),
        '"[big_int_2]"': str(random.randint(10000000000, 99999999999)),
        '"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]),
        '"[sleeper]"': str(random.randint(3, 9))
    }
    for k in replacements.keys():
        if k in template:
            print template.replace(k, replacements[k])

但是,每次运行此函数时,我都会得到输出:

OR NOT 7="[rand_num]"
OR NOT "[low_level_rand_num]"=21

它似乎正在替换字符串,但它并没有让它们被替换,我对错误的字符串不会被替换的地方做错了怎么办?如何解决这个问题并获得OR NOT 7=21的预期输出?

2 个答案:

答案 0 :(得分:0)

字符串替换不是就地完成的,更换后更新模板:

...
for k in replacements:
    if k in template:
        template = template.replace(k, replacements[k])
        print template

作为旁注,当在字典键上进行迭代时,您可以删除.keys调用,因为直接在字典上进行迭代将运行其键。

答案 1 :(得分:0)

您只是输出替换结果,template本身并没有改变。

template = "foo"
print template.replace("foo","bar") #outputs 'bar'
print template #outputs 'foo'
template = template.replace("foo","bar")
print template #outputs 'bar'