如何将变量传递给 re.sub 回调?

2024-03-10

我正在使用 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”行,并使用类似于两个注释行的内容。但是,如果我无法将其作为 re.sub 回调函数中的参数传递,那么如何在评估两个字符串时使用随机选择的映射2?

非常感谢。


我想最简单的方法是利用functools.partial,它允许您创建“部分评估”函数:

from functools import partial

def evaluate(match, mappings):
    return str(eval(match.group(0)[2:-1], mappings))

mappings = {'A': 1, 'B': 2}  # Or whatever ...

newstring = sub(r'\#\{([^#]+)\}', partial(evaluate, mappings=mappings), string)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将变量传递给 re.sub 回调? 的相关文章

随机推荐