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

使用Pandas read_csv时正则分隔符匹配问题求助

Pandas 处理带多行内容的时间标记文本问题

问题背景

需要处理一段带固定格式时间标记的TXT文本,时间标记格式为[dd.mm.yy, hh:mm:ss],部分文本内容会换行到下一行,目标是将同一时间标记下的多行内容合并,最终生成包含时间列和内容列的DataFrame。

原始数据

t = '''
[21.01.22, 07:32:11] text1
text2
[21.01.22, 07:34:18] text3
[21.01.22, 07:32:51] text4
text5
'''

期望结果

column1column2
[21.01.22, 07:32:11]text1 text2
[21.01.22, 07:34:18]text3
[21.01.22, 07:32:51]text4 text5

当前尝试代码

data = pd.read_csv('t.txt', delimiter=r"\[(..................)\]", header=None, engine="python")

解决方案

直接使用read_csv的delimiter参数无法处理跨行合并内容的场景,更可靠的方式是先预处理文本,再解析为DataFrame,以下提供两种可行方法:

方法1:逐行预处理合并

通过遍历文本行,将无时间标记的行合并到上一个时间标记对应的内容中:

import pandas as pd
from io import StringIO

# 读取文件内容
with open('t.txt', 'r', encoding='utf-8') as f:
    lines = [line.strip() for line in f if line.strip()]

processed_lines = []
current_time = None
current_content = []

for line in lines:
    # 判断是否为时间标记行(固定长度20位)
    if line.startswith('[') and len(line) == 20:
        # 保存上一组时间与内容
        if current_time:
            processed_lines.append(f"{current_time} {' '.join(current_content)}")
        # 拆分当前时间与初始内容
        current_time, content = line.split('] ', 1)
        current_time += ']'
        current_content = [content]
    else:
        # 合并到当前内容列表
        current_content.append(line)

# 处理最后一组未保存的数据
if current_time:
    processed_lines.append(f"{current_time} {' '.join(current_content)}")

# 将处理后的内容转为DataFrame
df = pd.read_csv(StringIO('\n'.join(processed_lines)), sep=r'] ', header=None, engine='python')
df[0] += ']'  # 补充分隔时去掉的右方括号
df.columns = ['column1', 'column2']

print(df)

方法2:正则表达式批量匹配

利用正则一次性匹配所有时间块及对应内容,再处理换行:

import re
import pandas as pd

# 读取文件内容
with open('t.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# 正则匹配:时间标记 + 后续所有非时间标记的内容
pattern = r'(\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\])\s*(.*?)(?=\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\]|$)'
matches = re.findall(pattern, content, re.DOTALL)

# 整理匹配结果,将换行替换为空格
data = []
for time_block, text in matches:
    cleaned_text = ' '.join(text.strip().split('\n'))
    data.append([time_block, cleaned_text])

# 转为DataFrame
df = pd.DataFrame(data, columns=['column1', 'column2'])
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:41:58