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

Python正则仅匹配WhatsApp聊天首条,如何提取全部时间戳与消息?

解决WhatsApp聊天记录提取时间戳和消息的问题

问题根源

你的代码只能拿到第一个匹配结果,核心原因是**file.readline()只读取了文件的第一行**,正则自然只能匹配这一行的内容。此外正则表达式里的时间戳格式有小错误,也会影响匹配效果。

修正后的代码

import re

# 使用with语句自动管理文件资源,读取整个文件内容
with open("Chat Analysis\\Chat.txt", "r", encoding='utf8') as file:
    text = file.read()

# 修正正则:替换时间戳里的.为空格,添加多行匹配标志
pattern = r'^(\d{1,2}/\d{1,2}/\d{4}, \d{1,2}:\d{2} [ap]m) - (.+)$'
matches = re.findall(pattern, text, re.MULTILINE)

# 生成你期望格式的列表
result_list = [f"{timestamp} - {message}" for timestamp, message in matches]

# 输出结果
print("List =", result_list)

关键调整说明

  1. 读取全部文件内容:用file.read()替代readline(),确保能获取所有聊天行的内容。
  2. 修正正则表达式:把时间戳部分的.换成空格(WhatsApp时间戳格式是DD/MM/YYYY, HH:MM am/pm,时间和am/pm之间是空格),避免匹配错误内容。
  3. 添加多行匹配标志:re.MULTILINE让正则的^和$匹配每行的开头和结尾,确保每条消息的时间戳都能被捕获。
  4. 生成目标格式列表:用列表推导式直接生成['Timestamp - Message', ...]的结构。

处理跨换行的消息

如果聊天记录里存在单条消息跨多行的情况,上面的代码会截断消息,这时可以用下面的正则来匹配多行消息:

# 匹配跨换行的消息,直到下一个时间戳或文本结束
pattern = r'^(\d{1,2}/\d{1,2}/\d{4}, \d{1,2}:\d{2} [ap]m) - (.+?)(?=^\d{1,2}/\d{1,2}/\d{4}, |\Z)'
matches = re.findall(pattern, text, re.DOTALL | re.MULTILINE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:22:49