Python按条件提取文本文件数据时IndexError问题排查及解决
问题解答:提取指定行内的数值并修复正则错误
错误原因
你写的正则表达式r',160p30'没有定义任何捕获组(即没有用()包裹要提取的目标内容),但代码里却尝试用re.search(pattern, line)[1]去获取第1个捕获组的内容,这直接导致了IndexError: no such group。而且这个正则本身也没匹配到你真正需要的[]内的数值,只是匹配了行尾的,160p30,逻辑完全偏离需求。
正确实现方式
要完成需求,我们可以分两步走:先筛选出包含160p30的行,再提取该行中[]内的数值并格式化。下面是两种可行的实现:
方法1:字符串直接处理(简单直观)
import numpy as np def extract_160p30_values(psnr_path): a_list = [] tmp = np.zeros(len(psnr_array)) # 确保psnr_array已提前定义 with open(psnr_path, 'r') as f: for line in f: line = line.strip() # 筛选目标行 if '160p30' in line: # 截取[]内的内容 start = line.find('[') + 1 end = line.find(']') nums_segment = line[start:end] # 替换逗号为空格,输出目标格式 formatted_str = nums_segment.replace(',', '').strip() print(formatted_str) # 转成浮点数存入列表 float_nums = [float(num) for num in formatted_str.split()] a_list.extend(float_nums) return tmp, a_list
方法2:正则表达式匹配(更灵活)
如果偏好正则,可以直接写一个能捕获[]内数值且匹配行尾标识的模式:
import re import numpy as np def extract_160p30_values(psnr_path): a_list = [] tmp = np.zeros(len(psnr_array)) # 确保psnr_array已提前定义 # 正则模式:匹配[]内的数值段,同时限定行尾为160p30 pattern = r'\[([\d.,\s]+)\],0,160p30$' with open(psnr_path, 'r') as f: for line in f: match_result = re.match(pattern, line.strip()) if match_result: # 提取捕获到的数值字符串 nums_str = match_result.group(1) # 格式化为空格分隔的字符串 formatted_str = nums_str.replace(',', '').strip() print(formatted_str) # 转成浮点数列表 float_nums = [float(num) for num in formatted_str.split()] a_list.extend(float_nums) return tmp, a_list
注意事项
代码中的psnr_array需要你提前定义好长度,否则np.zeros(len(psnr_array))会触发报错。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

