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

如何在Python中转换含缺失字段的文本为结构化数据?

半结构化文本解析为结构化数据的实现方法

问题场景

给定如下半结构化文本:

Name
Alex

Address
14 high street
London

Color
blue
red

Name

Bob
Color
black

注意:Alex有两种颜色,Bob没有地址字段

需要将其解析为结构化格式(如字典列表),解决字段缺失、多值字段的处理问题。

优化实现方案

可以通过正则分割+字段匹配的方式,规范处理缺失字段和多值内容,代码如下:

import re

text = 'Name\nAlex\n\nAddress\n14 high street\nLondon\n\nColor\nblue\nred\n\nName\nBob\nColor\nblack'

# 分割每个用户的信息块,过滤空内容
profiles = [p for p in re.split(r'\n\n*(?=Name\n)', text, flags=re.IGNORECASE) if p.strip()]

result = []
for profile in profiles:
    user = {}
    # 提取姓名:匹配Name后到下一个字段或结束的内容
    name_match = re.search(r'Name\n(.*?)(?=\n\n*(?:Address|Color|$))', profile, flags=re.DOTALL | re.IGNORECASE)
    if name_match:
        user['Name'] = name_match.group(1).strip()
    # 提取地址:匹配Address后到下一个字段或结束的内容,换行替换为空格
    addr_match = re.search(r'Address\n(.*?)(?=\n\n*(?:Name|Color|$))', profile, flags=re.DOTALL | re.IGNORECASE)
    if addr_match:
        user['Address'] = addr_match.group(1).strip().replace('\n', ' ')
    # 提取颜色:处理多值情况,转为列表或单个字符串
    color_match = re.search(r'Color\n(.*?)(?=\n\n*(?:Name|Address|$))', profile, flags=re.DOTALL | re.IGNORECASE)
    if color_match:
        colors = [c.strip() for c in color_match.group(1).split('\n') if c.strip()]
        user['Color'] = colors if len(colors) > 1 else colors[0] if colors else None
    result.append(user)

# 输出结构化结果
for item in result:
    print(item)

代码逻辑说明

  1. 分割用户块:使用正向预查(?=Name\n)定位每个用户信息的起始点,分割后过滤空内容,避免无效块。
  2. 字段提取:对每个用户块,分别匹配Name/Address/Color字段,通过re.DOTALL让正则匹配换行内容,(?=...)作为字段终止边界,处理字段到下一个字段或文本结束的情况。
  3. 特殊处理:地址字段将换行替换为空格;颜色字段处理多值情况,多个颜色存为列表,单个存为字符串,无内容则不添加该字段。

运行后输出结果:

{'Name': 'Alex', 'Address': '14 high street London', 'Color': ['blue', 'red']}
{'Name': 'Bob', 'Color': 'black'}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:40:21