为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红颜莎娜 2021-12-09 14:58:35
我正在尝试使用遵循特定格式的单词在字符串中创建一些变量。例如,我的原始字符串是: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'
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

我认为您需要捕获一个正则表达式@+ 字母/数字/下划线,它是"@(\w+)(匹配@1 个或多个字母/数字/下划线并用它们创建一个组)馈送到替换函数


import re

mydict = {'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第三方模块(可以提供一个将进一步简化答案的变量列表),或此处的其他示例:评估字符串中的数学表达式)



查看完整回答
反对 回复 2021-12-09
?
长风秋雁

TA贡献1757条经验 获得超7个赞

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.2


10.72


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信