Python中如何使用正则表达式匹配聊天记录?

想把群里特定用户的聊天记录导出来
格式大概是这个样子
============================
2016-09-13 18:39:56 苹果(1234567)
这话说的,
怎么样

2016-09-13 20:40:04 香蕉(33445566)
床前明月光,疑是地上霜。

2016-09-13 21:40:26 土豆(180170160)
我睡觉去,大家继续嗨

2016-09-13 21:49:56 苹果(1234567)
举头望明月,低头思故乡。

2016-09-13 21:59:56 苹果(1234567)
现在几点了就睡?

2016-09-13 22:40:26 土豆(180170160)
太困了。
===================
比如想把苹果说过所有的话导出来,怎么个正则啊
时间匹配用的是:
\d{4}-\d{2}-\d{2}\s{1,6}\d{1,2}:\d{2}:\d{2}
自己写的表达式是:
(\d{4}-\d{2}-\d{2}\s{1,6}\d{1,2}:\d{2}:\d{2}\s{1,6}苹果(1234567)(\s.)(?=\d{4}-\d{2}-\d{2}\s{1,6}\d{1,2}:\d{2}:\d{2}))
运行结果是除了最后两行其他的都匹配了。
想要的是结果是把所有苹果说的话弄出来。
方法是匹配苹果的发言时间与下一个发言时间之间的内容,但是方法是错的。
可以在这个网站测试
https://regex101.com/
Python中如何使用正则表达式匹配聊天记录?


25 回复

太长不看,但我觉得你可以把

(\s.)

改成

(\s.)?

试试


import re

# 示例聊天记录文本
chat_log = """
[2023-10-27 10:30:25] 张三: 大家早上好!
[2023-10-27 10:31:02] 李四: 今天会议几点开始?
[2023-10-27 10:32:15] 王五: 应该是下午2点,别忘了带资料
[2023-10-27 10:33:00] 张三: 收到,谢谢提醒
"""

# 定义匹配聊天记录的正则表达式
pattern = r'\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] (\w+): (.+)'

# 使用findall匹配所有记录
matches = re.findall(pattern, chat_log)

# 解析匹配结果
for match in matches:
    timestamp, sender, message = match
    print(f"时间: {timestamp}")
    print(f"发送者: {sender}")
    print(f"内容: {message}")
    print("-" * 40)

# 如果要提取特定人的消息
zhang_pattern = r'\[.*?\] 张三: (.+)'
zhang_messages = re.findall(zhang_pattern, chat_log)
print("张三的所有消息:", zhang_messages)

# 匹配带时间范围的消息
time_range_pattern = r'\[2023-10-27 10:3\d:\d{2}\] .+?: .+'
time_range_matches = re.findall(time_range_pattern, chat_log)
print("10:30-10:39的消息:", time_range_matches)

这个正则表达式 r'\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] (\w+): (.+)' 分解说明:

  • \[\] 匹配方括号
  • (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 匹配时间戳并捕获为第一组
  • (\w+) 匹配用户名并捕获为第二组
  • (.+) 匹配消息内容并捕获为第三组

根据你的实际聊天记录格式调整正则表达式就行。

硬上了一个,仅供参考
\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2} 苹果(\d+)[\r\n]+[\s\S]*?[\r\n]{2}

好的 谢谢 我试试

哇 果然是大神 我废了半个小时吭哧吭哧 才编出了那个代码 看来还要提高水平。

一楼说得对 凑合用吧
^.苹果(1234567)(\s.)*?(?=[\d-\s:]{20})

大神啊 这话说的后面的 怎么样没有匹配出来呐
上面对话也是我编的,实际某个人发言格式可能很复杂 行与行之间还有空行。
我的思路是比管你的发言内容是什么,我只匹配两个时间里面的内容。

太长不看

20[\d-]{8}\s[\d:]{7,8}\s+[^\n]+(?:\d{5,11}|@\w+.[comnet]{2,3}))

不好意思啊 刚才用的本地软件测试的,我用那个网站测试了。实际结果是匹配出来的,我要好好研究下你的代码。

感觉这里没必要用正则额…

这样?
苹果(\d+)\s+(^.*$\n)+?^$

包括时间那么简单你自己写啦(或者用 2 楼的,「苹果」之前那一串)

<br>20\d{2}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2} 苹果\([^\)]+\) \n(((?!20\d{2}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2} ).)+)<br>

考虑一下不以两个\n 结束以及 QQ 号未必是纯数字的对话,选择单行模式,/gs

问题是如何导出聊天记录。。

喇叭状的按钮,打了消息管理器,导出即可。我选择的 txt 格式。

其实你做的这些都是徒劳的,如果人在说话的过程中贴了聊天记录,你怎么提取?

(?<=苹果.+\n)[\s\S]*?(?=\d{4}-\d{2}-\d{2}|$)

要不要试试看?但依旧觉得,这个不应该用正则来做,最多正则选取出来每个人说的话,然后用程序根据每个人说的话,再做二次筛选会灵活很多

哈哈 确实 只能匹配大概正确的 。
如果别人把含有他的多个聊天记录贴上来,只能把苹果每次发言的最后一个时间记录下来,如果下次他的发言时间大于上述时间,再用正则匹配。

我也不太懂啊 就是把群聊天消息导出到 txt 格式 到时候用过正则弄出特定用户的发言,您觉得是怎么做好呢。另外,你这个正则 好像不能匹配苹果发言。

可变长度断言,JavaScript 并不支持而已。这个特性看正则引擎的。不要断言就直接改用捕获分组咯,不过是速度会略慢一点,不过你这个用途也无所谓,根本看不出来。

(苹果.+\n)([\s\S]*?)(\d{4}-\d{2}-\d{2}|$)

第二个分组的内容,就是你要的东西。

把(\s.*)*换成:’ \n([\s\S]?)’

嗯 为什么写成这样不行呢 (\s\S.)?

这种情况,就分步骤正则嘛
简单的逻辑加上正则,比精心编排的正则省时省力

(\s\S.)?的意思是匹配:([一个空格][一个非空格][任意长度字符])重复任意次,中括号之间是顺序匹配关系。这就只能匹配 " xxxx yyyy zzzz dddd…"这种字符串了呀

回到顶部