咨询基于正则提取双格式逗号分隔TXT数据并生成单行透视表的方法
实现方案
你目前使用的re.findall('(.*?)\,(.*)',text) 匹配不全的核心原因有三个:
- 未开启多行匹配模式,正则的边界规则仅对整个文本生效,不会逐行识别行首/行尾位置,只能匹配到第一行内容
- 未做行级拆分,非贪婪匹配会跨行捕获相邻行的内容,导致字段串位
- 用统一规则匹配两种结构完全不同的行(前3行的元数据行、后续的variable指标行),无法覆盖特殊格式的字段
行级匹配逻辑
逐行遍历文本内容,对两类结构的行使用专属正则匹配,避免规则冲突:
- 固定元数据行(前3行)
结构特征:行首为字段名:,后续跟逗号分隔的字段值,行尾可能带冗余逗号、字段值前后存在空白
匹配正则:^([^:]+):,\s*(.*?)\s*,?$
捕获逻辑:第一个捕获组提取元数据列名(比如name、age),第二个捕获组提取对应字段值,自动过滤行尾多余逗号、字段前后的空白字符 - 变量指标行(剩余的variable开头的行)
结构特征:无行首冒号,固定为4个逗号分隔的字段,最后一个为无意义冗余值
匹配正则:^([^,]+),([^,]+),([^,]+),[^,]+$
捕获逻辑:第一个捕获组提取变量名,第二个捕获组提取分类值(即行内的foo),第三个捕获组提取需要的指标值,最后一个类似bar的冗余字段直接丢弃
透视转换规则
提取完所有捕获内容后,按照规则拼接列名,对齐为单行结构:
- 元数据行的列名直接使用捕获的字段名,匹配对应字段值
- 变量指标行的列名使用
变量名_分类值格式拼接(比如variable1拼接分类值foo,得到列名variable1_foo),对应的值为捕获的指标值
示例实现
以下为基于Python内置re库的可直接运行代码,无需额外依赖:
import re # 读取目标TXT文件内容 with open("target.txt", "r", encoding="utf-8") as f: text = f.read() # 定义两类行的匹配规则,开启多行模式让^逐行生效 meta_pattern = re.compile(r'^([^:]+):,\s*(.*?)\s*,?$', re.MULTILINE) var_pattern = re.compile(r'^([^,]+),([^,]+),([^,]+),[^,]+$', re.MULTILINE) # 存储提取后的键值对 extracted = {} # 逐行匹配 for line in text.splitlines(): line = line.strip() if not line: continue # 匹配元数据类行 meta_res = meta_pattern.match(line) if meta_res: col, val = meta_res.groups() extracted[col.strip()] = val.strip() continue # 匹配变量指标类行 var_res = var_pattern.match(line) if var_res: var_name, var_type, var_val = var_res.groups() full_col = f"{var_name.strip()}_{var_type.strip()}" extracted[full_col] = var_val.strip() # 输出为要求的单行列结构 print("\t".join(extracted.keys())) print("\t".join(extracted.values()))
代码输出(对应样例输入)
name age birth date variable1_foo variable2_foo variable3_foo variable4_foo john smith 23 / / 1 2 5 19
内容的提问来源于stack exchange,提问作者Won Chul Chung
相关产品推荐
相关产品推荐

