You need to enable JavaScript to run this app. Python正则表达式实现指定联系人完整多行聊天消息的提取打印
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式实现指定联系人完整多行聊天消息的提取打印

问题根因
  • 原代码采用逐行独立判断的逻辑,没有跟踪消息的归属状态:聊天文件中所有没有时间戳前缀的行,本质都是上一条消息的内容续行,逐行扫的时候会直接跳过这些续行内容。
  • 代码中re.findall(r"[\W\d\W\w]",line)属于完全无效的冗余逻辑,这个正则会匹配所有字符,没有任何筛选判断作用。
  • 直接用name in line判断发送人存在误判风险,只要消息正文里提到目标名字,就会被错认成目标用户发的消息。
调整实现方案

WhatsApp导出的聊天文件有固定结构:只有每条新消息的首行才会以行首的方括号时间戳开头,格式统一为[日期, 时间 时段] 发送人: 消息内容,后续所有没有时间戳开头的行,都属于上一条消息的续行。我们只需要加一个状态标记跟踪当前消息的归属人,就能完整抓取整条消息的所有内容。

调整后可直接运行的代码
import re

target_sender = "Lim"
# 精准匹配消息头格式:识别行首的时间戳,提取对应发送人
header_pattern = re.compile(r"^\[\d{1,2}/\d{1,2}/\d{2,4}, \d{1,2}:\d{2}:\d{2} [AP]M\]\s*([^:]+):")
# 状态标记:记录当前累积的消息是否来自目标发送人
is_target_msg = False

with open("_chat.txt", "r", encoding="utf-8") as f:
    for line in f:
        current_line = line.rstrip("\n")
        # 检查当前行是不是新消息的开头
        header_match = header_pattern.match(current_line)
        if header_match:
            # 从消息头提取发送人,去掉前后多余空格
            sender = header_match.group(1).strip()
            # 更新状态标记
            is_target_msg = (sender == target_sender)
        # 只要是目标发送人的消息,不管是消息头还是续行,全部输出
        if is_target_msg:
            print(current_line)
效果说明
  • 不管目标发送人的消息带多少行无时间戳的续行,只要没有碰到下一个新的消息头,状态标记就会持续为真,所有续行都会被完整打印,不会漏内容。
  • 从消息头提取发送人的逻辑,不会把消息正文里提到的目标名字误判为发送人,匹配准确率远高于直接搜整行文本的方式。
  • 适配了消息头里发送人名字前后带/不带空格的格式(比如Lim :xx和Tan:yy都能正确识别)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 18:15:07