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

Python正则匹配Peak Mem值返回None,求实现内存阈值判断方案

解决正则表达式匹配Peak Mem值返回None的问题

首先,咱们来拆解你遇到的问题:你的正则表达式没能正确匹配统计数据里的Peak Mem实际值,导致匹配结果返回None。下面一步步分析问题并给出可行的解决方案:

问题根源分析

先看你的目标数据行:

00:SCAN HDFS 1 115.097ms 115.097ms 36.86K -1 99.97 MB 960.00 MB edw.dw_loan_int_amt

你要提取的是99.97 MB,但你的正则和代码有几个关键问题:

  1. 正则写法错误:你写的\ .B本意是匹配 MB,但这里的.是正则通配符(匹配任意单个字符),而且少了M字符,导致无法匹配MB后缀;
  2. 匹配方法选错:re.match()是从字符串起始位置开始匹配的,而你的目标值不在行首,这是返回None的核心原因——应该用re.search()在整个字符串中查找匹配;
  3. 冗余匹配逻辑:.*?这类非贪婪匹配没必要过度使用,直接定位目标格式更精准。

修正后的解决方案

方案1:优化正则表达式匹配

用re.search()替代re.match(),同时修正正则格式,精准匹配数字+空格+MB的组合:

import re

result = sum_data['summary']
# 修正后的正则:匹配带小数的数字 + 空格 + MB
pattern = r"(\d+\.\d+\s+MB)"
m = re.search(pattern, result)

if m:
    peak_mem = m.group(1)
    # 提取数值部分做大小判断
    mem_value = float(peak_mem.split()[0])
    if mem_value > 90:
        print(f"内存值{peak_mem}大于90MB,执行指定操作")
        # 在这里编写你的指定操作代码
else:
    print("未匹配到Peak Mem值")

方案2:按列拆分提取(更可靠)

因为这是结构化的表格数据,直接按列拆分字段的方法比正则更不易出错,还能确保提取的就是Peak Mem列:

import re

result = sum_data['summary']
lines = result.split('\n')

for line in lines:
    # 跳过表头和分隔线
    if 'Operator' in line or '---' in line:
        continue
    # 处理多个连续空格的情况,拆分字段
    fields = re.split(r'\s+', line.strip())
    # 表头顺序:Operator, #Hosts, Avg Time, Max Time, #Rows, Est. #Rows, Peak Mem...
    if len(fields) >= 7:
        peak_mem = fields[6]
        mem_value = float(peak_mem.split()[0])
        if mem_value > 90:
            print(f"内存值{peak_mem}大于90MB,执行指定操作")
            # 执行你的自定义操作

关键知识点总结

  • 当目标内容不在字符串开头时,用re.search()替代re.match();
  • 正则中要匹配字面的.,需要转义成\.,或者用字符类[.];
  • 处理表格类结构化数据时,按字段拆分的方法往往比正则更直观、更可靠。

内容的提问来源于stack exchange,提问作者TheNewGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:43