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
相关产品推荐
相关产品推荐

