Python实现特定格式字符串转数组求助:Excel数据导入解析
问题描述
需要编写Python代码将特定格式的字符串转换为数组,例如将字符串'[[M,,[10,20]],[F,,[7,9]]]'转换为数组[['M','',['10','20']],['F','',['7','9']]]。该需求来自导入Excel数据时,部分单元格包含此类数组格式的数据。
此前使用ChatGPT生成的代码无法正常运行,代码及错误结果如下:
def parse_string(s): result = [] current_list = [] i = 0 while i < len(s): char = s[i] if char == '[': inner_result, remaining_string = parse_string(s[i + 1:]) current_list.append(inner_result) i += len(inner_result) + 2 elif char == ']': result.append(current_list) return result, s[i + 1:] elif char == ',': if i > 0 and s[i - 1] == ',': current_list.append('') i += 1 elif char.isalnum() or char == '.': j = i while j < len(s) and (s[j].isalnum() or s[j] == '.' or s[j] == '-'): j += 1 current_list.append(s[i:j]) i = j else: i += 1 return result, '' string = '[[M,,[10,20]],[F,,[7,9]]]' result, _ = parse_string(string) print(result)
运行后输出错误结果:[[[[[['M', '', [['10', '20']], '20']], '', [['10', '20']], '20']], '', [['10', '20']], '20']]
解决思路与实现
方法一:预处理为合法JSON格式(推荐)
原字符串不符合JSON规范的核心问题:
- 未加引号的标识符(如
M、F) - 连续逗号表示的空值(如
,,)
通过正则表达式替换将其转换为合法JSON,再用Python内置json模块解析,这种方法简洁且不易出错:
import re import json def parse_custom_array(input_str): # 给未被引号包裹的字母/数字/符号添加双引号 processed = re.sub(r'(?<=[\[,])([A-Za-z0-9.+-]+)(?=[\],])', r'"\1"', input_str) # 将连续逗号替换为包含空字符串的逗号(,, → ,"",) processed = re.sub(r',,', r',"",', processed) # 处理列表末尾的连续逗号(如[,] → [""]) processed = re.sub(r',(?=\])', r',""', processed) # 解析为Python列表 return json.loads(processed) # 测试 test_str = '[[M,,[10,20]],[F,,[7,9]]]' output = parse_custom_array(test_str) print(output) # 输出:[['M', '', ['10', '20']], ['F', '', ['7', '9']]]
方法二:修复递归解析代码
原递归代码的错误在于]的处理逻辑错误,以及递归返回值的索引计算不当。以下是修复后的版本:
def parse_string(s): current_list = [] i = 0 length = len(s) while i < length: char = s[i] if char == '[': # 递归解析内部列表,返回内部列表和剩余字符串的起始位置 inner_list, offset = parse_string(s[i+1:]) current_list.append(inner_list) i += offset + 1 # 跳过当前的'['和递归处理后的']' elif char == ']': # 遇到闭合括号,返回当前列表和当前索引+1(供上层处理剩余内容) return current_list, i + 1 elif char == ',': # 处理连续逗号或开头逗号的空值情况 if i == 0 or s[i-1] in '[,' : current_list.append('') i += 1 elif char.isalnum() or char in '.-': # 提取连续的有效字符作为元素 j = i while j < length and (s[j].isalnum() or s[j] in '.-'): j += 1 current_list.append(s[i:j]) i = j else: # 跳过无关字符(如果存在) i += 1 return current_list, i # 测试:外层字符串以[开头,从索引1开始解析 test_str = '[[M,,[10,20]],[F,,[7,9]]]' output, _ = parse_string(test_str[1:]) print(output) # 输出:[['M', '', ['10', '20']], ['F', '', ['7', '9']]]
内容的提问来源于stack exchange,提问作者Abner Hsu
相关产品推荐
相关产品推荐

