gpt4 book ai didi

python - 用列表中的值替换字符串中的变量名并避免冗余替换

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:39 25 4
gpt4 key购买 nike

给定一个评估方程:

    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!

最佳答案

(在我看来)这可以通过字符串格式化更轻松地完成 - 假设您对输入字符串有一些控制:

>>> d={'action':'bar','verb':'foo'}
>>> print ("don't %(action)s a %(verb)s"%d)

或者这样怎么样:

import re
class DictFormatter(dict):
def __missing__(self,k):
return k

eval_str = '(VAR2 == VAR2::VALUE_X or VAR2 != VAR2::VALUE_Z) and (VAR1 > 0 and VAR1 < 10)'
var_dict = DictFormatter()
var_dict.update({'VAR1':'5','VAR2':'VAR1::VALUE_Y'})

extra_space = re.compile(r'[\w:]+') #words are alphanumeric + ':' + '_'.
eval_str = extra_space.sub(lambda m: ' %s '%(m.group()),eval_str) #make sure there is space between "words"
eval_list = [var_dict[item] for item in eval_str.split()]

print " ".join(eval_list)

关于python - 用列表中的值替换字符串中的变量名并避免冗余替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11413950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com