字符串数字求和代码触发IndexError索引越界,请求问题排查
问题排查:提取连续数字求和时的IndexError错误
错误原因
你的代码触发IndexError的核心原因是:当st为空字符串时,直接访问st[-1]会导致索引越界。比如输入字符串开头的'a'是第一个字符,此时st还没有被赋值任何内容,进入else分支后执行st[-1].isdigit(),空字符串没有任何元素,自然抛出索引越界错误。
另外,原代码还有潜在问题:如果连续遇到多个非数字字符,会重复添加逗号,最后split时可能产生空字符串元素,影响求和结果。
修复原代码方案
修改else分支的判断逻辑,先检查st是否非空,再判断最后一个字符是否为数字;同时处理末尾可能存在的逗号,避免split出空元素:
s = "ab12cd23ed456gh789" st = '' for letter in s: if letter.isdigit(): st += letter else: # 先确保st非空,且最后一个字符是数字时才添加分隔符 if st and st[-1].isdigit(): st += ',' # 移除末尾可能多余的逗号 st = st.rstrip(',') # 分割并转成整数,过滤空字符串 num_list = [int(num) for num in st.split(',') if num] print(num_list) print(sum(num_list))
更简洁的正则表达式方案
提取连续数字这类模式匹配场景,用正则表达式会更高效简洁,直接匹配所有连续数字串:
import re s = "ab12cd23ed456gh789" # 匹配所有连续的数字序列 num_strings = re.findall(r'\d+', s) # 转换为整数并求和 num_ints = [int(num) for num in num_strings] total = sum(num_ints) # 按预期格式输出 print(f"{' + '.join(num_strings)} = {total}")
运行后直接输出:12 + 23 + 456 + 789 = 1280,完全符合需求。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

