You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需正则与第三方库 从字母数字字符串提取连续数字序列方案

从字母数字混合字符串提取温度值的最优实现方案

你的原有实现可以正常得到结果,但存在两个明显的短板:

  1. 需要遍历两次字符串(一次插入空格,一次拆分判断),数据量极大的情况下时间开销更高
  2. 需要生成一份和原字符串长度接近的中间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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:03