如何合并TXT文件中连续批次的行?Python正则匹配问题排查
解决TXT文件中连续聊天内容合并的问题
你的核心问题在于逐行读取文件并匹配正则,这导致每一行单独处理,根本无法捕获User#开头行之后的多行内容。另外原正则表达式的写法也有错误,无法正确匹配目标内容。
正确实现思路
- 一次性读取整个文件的全部内容,这样才能匹配跨多行的内容块。
- 使用正则表达式匹配以
User#开头的行,以及后续所有非空行(直到遇到空行或文件结束)。 - 将每个用户对应的多行消息合并成用空格分隔的字符串。
修正后的代码
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
相关产品推荐
相关产品推荐

