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

如何将DataFrame某列按指定分隔符拆分生成列表,优先不使用正则表达式

问题分析与解决方法

原代码存在的问题

  • 逻辑错误:调用re.split完成拆分后,你又使用' '.join()将拆分得到的列表重新拼接为单个字符串,自然无法得到预期的列表结果
  • 匹配规则错误:正则会无差别拆分所有命中的分隔符,不会区分分隔符是否位于成对括号内部,不符合你保留括号内内容不拆分、保留括号本身的需求
  • 缺少清洗逻辑:拆分后的元素会残留前后多余空格、首尾引号等无效内容

实现方案(无正则,易调试修改)

你没有正则使用经验的话,更推荐用字符遍历计数的方案实现,逻辑清晰,后续调整规则也很方便:

def split_ingredient(raw_str):
    result = []
    current_segment = []
    # 标记当前所处的括号嵌套层级
    bracket_level = 0
    delimiters = {',', ';', '(', ')', ':'}
    # 先清理首尾多余的引号、空格
    s = str(raw_str).strip().strip('"')
    
    for char in s:
        if char == '(':
            bracket_level += 1
            # 碰到最外层左括号,先把之前积攒的内容存入结果
            if bracket_level == 1 and current_segment:
                result.append(''.join(current_segment).strip())
                current_segment = []
            current_segment.append(char)
        elif char == ')':
            current_segment.append(char)
            bracket_level -= 1
            # 碰到最外层右括号,把整个括号内容存入结果
            if bracket_level == 0 and current_segment:
                result.append(''.join(current_segment).strip())
                current_segment = []
        # 只有在括号最外层碰到分隔符才做拆分
        elif char in delimiters and bracket_level == 0:
            if current_segment:
                result.append(''.join(current_segment).strip())
                current_segment = []
        else:
            current_segment.append(char)
    # 把最后一段未处理的内容存入结果
    if current_segment:
        result.append(''.join(current_segment).strip())
    # 过滤空字符串
    return [item for item in result if item]

调用方法

直接对DataFrame的目标列应用上面的函数即可:

df['splited'] = df['ingredient'].apply(split_ingredient)

如果需要将括号内部的内容再拆分为子列表,只需要在括号内容入队前,对括号内的字符串再调用一次拆分函数即可。

内容的提问来源于stack exchange,提问作者Yoss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:06:03