如何在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)
代码逻辑说明
- 分割用户块:使用正向预查
(?=Name\n)定位每个用户信息的起始点,分割后过滤空内容,避免无效块。 - 字段提取:对每个用户块,分别匹配
Name/Address/Color字段,通过re.DOTALL让正则匹配换行内容,(?=...)作为字段终止边界,处理字段到下一个字段或文本结束的情况。 - 特殊处理:地址字段将换行替换为空格;颜色字段处理多值情况,多个颜色存为列表,单个存为字符串,无内容则不添加该字段。
运行后输出结果:
{'Name': 'Alex', 'Address': '14 high street London', 'Color': ['blue', 'red']} {'Name': 'Bob', 'Color': 'black'}
内容的提问来源于stack exchange,提问作者asdf222
相关产品推荐
相关产品推荐

