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

如何合并TXT文件中连续批次的行?Python正则匹配问题排查

解决TXT文件中连续聊天内容合并的问题

你的核心问题在于逐行读取文件并匹配正则,这导致每一行单独处理,根本无法捕获User#开头行之后的多行内容。另外原正则表达式的写法也有错误,无法正确匹配目标内容。

正确实现思路

  1. 一次性读取整个文件的全部内容,这样才能匹配跨多行的内容块。
  2. 使用正则表达式匹配以User#开头的行,以及后续所有非空行(直到遇到空行或文件结束)。
  3. 将每个用户对应的多行消息合并成用空格分隔的字符串。

修正后的代码

import re

pattern = r'([a-zA-Z]+#[0-9]+)\n(.+?)(?=\n\n|\Z)'
data = {
    'name': [],
    'message': []
}

with open('chat.txt', 'rt', encoding='utf-8') as file:
    content = file.read()
    # 匹配所有用户块
    matches = re.findall(pattern, content, flags=re.DOTALL)
    for name, msg_lines in matches:
        # 把多行消息合并成空格分隔的字符串,同时去掉换行符和多余空格
        cleaned_msg = ' '.join(line.strip() for line in msg_lines.splitlines() if line.strip())
        data['name'].append(name)
        data['message'].append(cleaned_msg)

# 输出结果示例
for name, msg in zip(data['name'], data['message']):
    print(f"{name} {msg}")

代码说明

  • re.DOTALL:让正则中的.可以匹配换行符,这样能捕获多行的消息内容。
  • 正则([a-zA-Z]+#[0-9]+)\n(.+?)(?=\n\n|\Z):
    • ([a-zA-Z]+#[0-9]+):捕获用户名(比如User#0001)。
    • \n:匹配用户名后的换行。
    • (.+?):非贪婪匹配后续所有内容,直到遇到(?=\n\n|\Z)(正向预查,匹配空行或文件结尾)。
  • cleaned_msg:将捕获到的多行消息拆分、去掉每行的首尾空格、过滤空行,再用空格连接成一行。

测试效果

对于你提供的原内容,运行后会输出:

User#0001 Hello Whats Up
User#0002 Hi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:40:32