使用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 '''
期望结果
| column1 | column2 |
|---|---|
| [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
相关产品推荐
相关产品推荐

