我正在使用re.sub回调函数将子字符串替换为随机值,但我希望不同的字符串之间的随机值是相同的。由于re.sub回调函数不允许参数,所以我不确定该如何实现。
这是我正在做的简化版本:
def evaluate(match):
mappings = {'A': 1, 'B': 2}
return str(eval(match.group(0)[2:-1], mappings))
# variables = {'A':[1,2,3,4,5], 'B':[1,2,3,4,5]}
# mappings2 = {k:v[random.randint(0,len(v)-1)] for k, v in variables.items()}
string_one: "#{A} + #{B}"
string_two: "#{A+B}"
newstring_one = sub(r'\#\{([^#]+)\}', evaluate, string_one)
newstring_two = sub(r'\#\{([^#]+)\}', evaluate, string_two)
现在,字符串将被正确地评估:newstring_one 是"1 + 2",newstring_two 是"3"。但我希望能够随机选择值,并仍然使它们替换在两个字符串中。这将涉及删除'evaluate'中的 'mappings' 行,并使用类似于两行注释的内容。然而,如果我不能将随机选择的 mappings2 作为参数传递给 re.sub 回调函数,如何让它在评估两个字符串时被使用?
非常感谢。
evaluate
参数的顺序,你可以简单地写成partial(evaluate, mappings)
。 - tzotevaluate()
更自然,并且我想展示partial()
的灵活性。 - Ferdinand Beyer