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,但你的正则和代码有几个关键问题:
- 正则写法错误:你写的
\ .B本意是匹配MB,但这里的.是正则通配符(匹配任意单个字符),而且少了M字符,导致无法匹配MB后缀; - 匹配方法选错:
re.match()是从字符串起始位置开始匹配的,而你的目标值不在行首,这是返回None的核心原因——应该用re.search()在整个字符串中查找匹配; - 冗余匹配逻辑:
.*?这类非贪婪匹配没必要过度使用,直接定位目标格式更精准。
修正后的解决方案
方案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
相关产品推荐
相关产品推荐

