鉴于EVAL的公式:
eval_str = 'VAR1 > 0 and VAR1 < 10 and (VAR2 == VAR1::VALUE_X or VAR2 == VAR2::VALUE_X)'
任务:我需要用引号替换变量(VAR1,VAR2在这个例子中),与它们的实际值,并围绕给定的“常量”(VAR1 :: VALUE_X)。
问题:由于变量名存在于恒定,在EVAL字符串,因为变量可以使用包含变量名称本身的字符串替换 - 我碰上那里的恒定值的变量名称将是另一个常量替换问题或可变值。 更好地显示...
eval_str = '(VAR2 == VAR2::VALUE_X or VAR2 != VAR2::VALUE_Z) and (VAR1 > 0 and VAR1 < 10)'
var_dict = {'VAR1':'5','VAR2':'VAR1::VALUE_Y'}
# what I do is strip out most of the special characters
# the following findall = ['VAR1', '0', 'and', 'VAR1', '10', 'and', 'VAR2', 'VAR1::VALUE_X', 'or', 'VAR2', 'VAR2::VALUE_X']
for x in re.findall('[^\s()<>=!]+',eval_str):
# skip digits, and, or, None *need to improve regex
if x.replace('.','').isdigit() or x == 'and' or x == 'or' or x == 'None':
continue
# if variable is in dict
if x in var_dict.keys():
# only replace first
eval_str = eval_str.replace(x,var_dict[x],1)
# if is constant
elif x.__contains__('::'):
eval_str = eval_str.replace(x,'\'%s\''%x,1)
print eval_str
# (5::VALUE_Y == '5::VALUE_Y::VALUE_X' or VAR2 != 'VAR2::VALUE_Z') and (VAR1 > 0 and VAR1 < 10)
而不是通过每一个变量/值递增的,也许会有更好的使用正则表达式为每一个全部更换? 或者,我可以解决我的现有解决方案是否有一种方式来记住我的每一个后字符串中的位置更换?
Tyvm!