我正在使用re.sub回调来替换具有随机值的子字符串,但我希望随机值在不同的字符串中是相同的。由于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”。但我希望能够随机挑选这些值,并且仍然可以在两个字符串中替换它们。这将涉及删除“评估”中的“映射”行,并使用类似两条注释行的内容。但是,如果我不能在re.sub回调函数中将它作为参数传递,那么如何在评估两个字符串时使用随机选择的映射2?
非常感谢。
请注意:如果您颠倒了'evaluate'参数的顺序,您可以说'partial(evaluate,mappings)'。 – tzot 2010-07-11 09:02:59
是的,但我故意使用了参数顺序,因为对我来说,以这种方式定义'evaluate()'会更自然,我想展示partial()的灵活性。 – 2010-07-11 13:30:10