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

如何解析同行及换行的结构化值?正则匹配技术咨询

解决跨行键值对提取与结构化转换问题

我来帮你搞定这个正则匹配和生成DataFrame的问题,核心是要同时处理同行和跨行的键值对,并且保证每条记录的列数一致。

问题分析

你的输入文本用@分隔多条记录,每条记录里的[ColX]值结构中,值可能紧跟在括号后,也可能换行到下一行。之前的正则没处理好换行,是因为默认.不匹配换行符,而且没有准确界定值的结束位置,re.MULTILINE只影响^和$的匹配范围,对.的行为没有帮助。

解决方案步骤

  1. 分割独立记录:先把输入按@拆分成单条记录,避免跨记录干扰;
  2. 正则精准匹配:使用带re.DOTALL的正则,匹配[列名]后直到下一个[或记录结尾的所有内容(包括换行);
  3. 结构化转换:提取列名和每行数据,转换为DataFrame。

完整代码实现

import re
import pandas as pd

# 你的输入文本(支持跨行场景,比如把某个值换行也能匹配)
input_text = "[Col1]ABC [Col2]DEF [Col3] GHI [Col4] [Col5] MNO @ [Col1]CBA [Col2]FED \n[Col3] IHG [Col4] [Col5] 555-12908JLKA ONM @"

# 1. 分割记录,过滤空内容
records = [record.strip() for record in input_text.split('@') if record.strip()]

# 2. 编译正则:匹配[列名]和对应值,直到下一个[或记录结束
# re.DOTALL让.匹配换行符,(?=\[|$)是正向预查,界定值的结束位置
pattern = re.compile(r'\[(.*?)\](.*?)(?=\[|$)', re.DOTALL)

# 3. 提取列名(从第一条记录获取,确保列统一)
first_record_matches = pattern.findall(records[0])
columns = [col_name for col_name, _ in first_record_matches]

# 4. 处理每条记录,生成行数据
row_data = []
for record in records:
    matches = pattern.findall(record)
    # 提取值并去除首尾空格,空值自动保留为空字符串
    row = [val.strip() for _, val in matches]
    row_data.append(row)

# 5. 转换为DataFrame并输出CSV格式
df = pd.DataFrame(row_data, columns=columns)
print(df.to_csv(index=False))

关键细节说明

  • re.DOTALL:这个标志是核心,让正则中的.可以匹配换行符,完美解决跨行值的匹配问题;
  • 正向预查(?=\[|$):确保只提取到下一个列名[ColX]之前的内容,不会把后续列的内容错误包含进来;
  • 列一致性保障:从第一条记录提取列名,假设所有记录的列顺序和数量一致(符合你的需求),如果有异常情况,可以额外添加校验逻辑(比如补全空列、抛出提示等)。

输出结果

运行代码后会输出你期望的结构化CSV:

Col1,Col2,Col3,Col4,Col5
ABC,DEF,GHI,,MNO
CBA,FED,IHG,,555-12908JLKA ONM

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:11:59