Chr*_*ris 4 python regex callback
我使用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)
Run Code Online (Sandbox Code Playgroud)
现在,就目前而言,将正确评估字符串:newstring_one为"1 + 2",newstring_two为"3".但是我希望能够随机选择值,并且仍然可以在两个字符串中替换它们.这将涉及删除'evaluate'中的'mappings'行,并使用类似两条注释行的内容.但是,如果我不能在re.sub回调函数中将其作为参数传递,那么在评估两个字符串时如何使用随机选择的映射2?
非常感谢.
Fer*_*yer 12
我想最简单的方法是使用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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4273 次 |
| 最近记录: |