无需正则与第三方库 从字母数字字符串提取连续数字序列方案
从字母数字混合字符串提取温度值的最优实现方案
你的原有实现可以正常得到结果,但存在两个明显的短板:
- 需要遍历两次字符串(一次插入空格,一次拆分判断),数据量极大的情况下时间开销更高
- 需要生成一份和原字符串长度接近的中间temp变量,会占用额外内存,超大数据量场景下容易出现内存溢出问题
更合理的方案是采用一次遍历直接提取的思路,全程不需要生成额外的大中间对象,时间和内存效率都更高,完全适配超大数据量的处理需求。
实现逻辑
- 遍历字符串的每个字符,遇到
+、-、*三个指定前导符时,标记后续开始收集数字 - 处于收集状态时遇到数字,就暂存到当前数字缓存中
- 遇到其他字符时,若当前有缓存的数字,就将缓存内容转成整数存入结果列表,清空缓存并关闭收集状态
- 遍历结束后检查是否有剩余的未存入的缓存数字,做收尾处理
示例代码
def extract_temperature(input_str: str) -> list[int]: result = [] current_num = [] collect_flag = False for char in input_str: if char in "+-*": # 遇到前导符,先处理上一个未保存的数字 if current_num: result.append(int("".join(current_num))) current_num.clear() collect_flag = True elif char.isdigit() and collect_flag: current_num.append(char) else: # 非数字非前导符,结束当前收集 if current_num: result.append(int("".join(current_num))) current_num.clear() collect_flag = False # 处理字符串末尾的数字 if current_num: result.append(int("".join(current_num))) return result # 测试用例 test_str = "BARN*21+77-48CDAIRY*87+56-12" print("The result ", extract_temperature(test_str))
运行输出为:[21, 77, 48, 87, 56, 12]
方案优势
- 仅对输入字符串做一次顺序遍历,时间复杂度为O(n),执行效率远高于多次遍历的方案
- 仅用长度等于单段数字最大长度的列表做缓存,内存开销极低,完全适配GB级超大数据量的处理场景
- 不需要依赖正则或其他字符串处理函数库,纯基础语法实现兼容性更高
内容的提问来源于stack exchange,提问作者Cara
相关产品推荐
相关产品推荐

