含英文数字与加减符号的字符串求和算法优化求助
问题描述
给定字符串:
s = 'one+one-two-one+two'
需要计算该字符串对应的数值总和(one对应1,two对应2)。原代码在处理类似'one+-one-two-one+two'的字符串时无法正常工作,求优化方案。
原尝试代码:
s = 'one+one-two-one+two' d = {'one': 1, 'two': 2} add = s.split('+') result = 0 for i in range(len(add)): val = d.get(add[i], None) if val: result += val else: sub = add[i].split('-') for j in range(len(sub)): if j > 0: result -= d[sub[j]] else: result += d[sub[j]] print(result)
问题分析
原代码通过+分割字符串的方式存在缺陷:当出现+-组合时,分割后会得到空字符串或者以-开头的片段(比如'one+-one'按+分割后得到['one', '-one']),此时d.get('-one')无法匹配字典中的键,导致报错或计算错误。
优化方案
使用正则表达式提取所有带符号的单词(包括开头无符号默认正的情况),统一处理所有正负号组合:
import re s = 'one+-one-two-one+two' d = {'one': 1, 'two': 2} # 匹配所有带正负号或无符号的目标单词 matches = re.findall(r'([+-]?)(one|two)', s) result = 0 for sign, word in matches: num = d[word] if sign == '-': result -= num else: # 空符号或+号统一做加法 result += num print(result)
代码说明
re.findall(r'([+-]?)(one|two)', s):正则表达式会捕获两部分内容,第一部分是可选的正负号([+-]?表示0或1个正负号),第二部分是目标单词one或two,能覆盖所有符号组合场景。- 遍历匹配结果时,根据符号对对应数值进行加减操作,彻底解决
+-这类特殊符号组合的解析问题。
也可以用更简洁的写法:
import re s = 'one+-one-two-one+two' d = {'one': 1, 'two': 2} matches = re.findall(r'([+-]?)(one|two)', s) result = sum(d[word] * (-1 if sign == '-' else 1) for sign, word in matches) print(result)
内容的提问来源于stack exchange,提问作者falukky
相关产品推荐
相关产品推荐

