如何单独匹配关键字后紧跟的所有数字?正则提取温度值遇阻求助
解决温度数值提取的正则问题
嘿,我来帮你搞定这个温度数值提取的问题!先看看你遇到的场景:要从字符串 28.6MH/s 27.3MH/s | Temp(C): 64 66 61 64 63 | Fan: 74% 76% 69% 75% 72% | HW: 21 21 21 里精准提取Temp后的温度数值,你之前写的正则 ((?<temp>\d\d)(?!\.).+(?!Fan))+ 没起作用,咱们先找找问题出在哪,再给你靠谱的解决方案。
原正则的问题分析
你的原正则逻辑有几个关键问题:
(?<temp>\d\d)(?!\.)试图匹配不带小数点的两位数字,但这个断言只能保证当前数字后面不是小数点,没法限定这些数字属于Temp专属区块;- 后面的
.+(?!Fan)是贪婪匹配任意字符(直到检测不到Fan的位置),这会把Temp之后到Fan之前的所有内容都吞进去,甚至可能包含无关的空白或符号,而且重复捕获的逻辑也没处理好,导致无法单独提取每个温度数值。
正确的正则解决方案
这里给你两个实用的正则方案,按需选择:
方案1:先捕获所有温度字符串再拆分
这个正则会先定位Temp区块,把所有温度数字组成的字符串一次性捕获,之后你可以按空格拆分出单个数值:
Temp\(C\):\s+((?:\d+\s*)+)(?=\s*\|\s*Fan)
各部分作用:
Temp\(C\):精确匹配标识文本,括号需要转义(因为正则里括号是特殊语法字符);\s+匹配标识后的一个或多个空白;(?:\d+\s*)+非捕获组,匹配“数字+任意空白”的组合,重复多次,确保捕获所有温度数字和中间的空格;(?=\s*\|\s*Fan)正向预查,确保后面跟着的是分隔符和Fan标识,避免误匹配其他区块的内容。
捕获到的组1内容是 64 66 61 64 63,之后用字符串拆分方法(比如Python里的split())就能得到单个温度数值。
方案2:直接逐个提取温度数值
这个正则可以直接匹配出每个温度数值,不需要额外拆分:
(?<=Temp\(C\):\s|\G(?!^)\s)\d+
各部分作用:
(?<=Temp\(C\):\s)正向后顾,确保当前位置前面是Temp(C):,匹配第一个温度数字;|\G(?!^)\s或者匹配上一次匹配结束位置后的空白(\G表示上一次匹配的结束点,(?!^)排除字符串开头的情况),这样就能依次匹配后续的每个温度数字;\d+匹配一个或多个数字(兼容一位或多位温度值,比如如果温度是个位数也能匹配)。
用这个正则做全局匹配的话,会直接得到所有温度数值的列表,比如 ['64', '66', '61', '64', '63'],非常方便。
测试示例(以Python为例)
import re s = "28.6MH/s 27.3MH/s | Temp(C): 64 66 61 64 63 | Fan: 74% 76% 69% 75% 72% | HW: 21 21 21" # 方案2的用法 temps = re.findall(r'(?<=Temp\(C\):\s|\G(?!^)\s)\d+', s) print(temps) # 输出: ['64', '66', '61', '64', '63']
内容的提问来源于stack exchange,提问作者Eugen T
相关产品推荐
相关产品推荐

