Python,遍历字符串并在特定单词的开头和结尾更改位置字符

我正在尝试使用遵循特定格式的单词在字符串中创建一些变量。

例如,我的原始字符串是:

string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'

我已经创建了一个字典如下:

mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}

我想创建的是一个函数,它将替换@Cost1(例如): mydict.get('Cost1')这样我就可以将字符串中的@ 视为变量的标记并在我的字典中查找值。

因此,我的意图是:

  • mydict.get('string.replace() 函数替换 @ by --> 这很容易

  • ')在@words 后面的字母链的末尾添加--> 这个我很难实现

我正在考虑使用 for 循环,但在每个以 @ 开头的单词结尾后添加“')”的逻辑上很挣扎。也考虑过发电机但不太确定

另外,我想添加一个检查,每个@Cost1、@Cost2 等都在我的字典中,但我应该能够做到这一点。

欢迎对此提供任何帮助

谢谢 !

埃里克

编辑:

根据您的评论,我希望我的最终输出是:

string = mydict.get('Cost1') + ( mydict.get('Cost2') + mydict.get('Cost3') ) / mydict.get('Revenue1') * 1.2'


红颜莎娜
浏览 239回答 2
2回答

繁星coding

我认为您需要捕获一个正则表达式@+ 字母/数字/下划线,它是"@(\w+)(匹配@1 个或多个字母/数字/下划线并用它们创建一个组)馈送到替换函数import remydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'expression = re.sub("@(\w+)",lambda m : str(mydict.get(m.group(1),0)),string)结果:'10 + (5 + 1) / 10 * 1.2'这种方法非常有效,因为它使用字典查找而不是循环来替换和创建与变量一样多的字符串。请注意,任何未知变量都会产生 0。如果您不想使用它mydict[m.group(1)]来触发关键错误。该lambda要么是不是强制性的。你可以写一个真正的函数,只要它接受一个match对象作为输入并返回一个字符串作为输出:def repfunc(m)    return str(mydict.get(m.group(1),0))re.sub("@(\w+)",repfunc,string)(这就是我们在获取值后转换为字符串的原因)一旦你有了那个表达式,你就可以应用一个评估器 (eval是最简单但不太安全的,ast.literal_eval因为它不支持操作而无法工作,但还有其他的,例如simpleeval第三方模块(可以提供一个将进一步简化答案的变量列表),或此处的其他示例:评估字符串中的数学表达式)

长风秋雁

string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}string = string.replace('@', '')for i in mydict:    string = string.replace(i, str(mydict[i]))print(string)print(eval(string))输出:10 + (5 + 1) / 10 * 1.210.72
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python