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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:17:03