匹配来自Python中WhatsApp日志的消息

时间:2018-12-09 13:37:51

标签: python regex

我想提取与WhatsApp中的消息匹配的所有模式。消息具有以下形式:

一行消息:

[19.09.17, 19:54:48] Marc: If the mean is not in the thousands, there's the problem

多行长消息:

[19.09.17, 19:54:59] Joe: > mean(aging$Population)
[1] 1593.577
Is what I get as solution

我能够将其拆分为日期,时间,发件人和消息,但仅针对单行格式,方法是先在文本文件行中读取行,然后在不同的分隔符上将这些行拆分。 但是,这不适用于多行邮件。现在,我正在尝试使用正则表达式,使用它们可以获取日期和时间,但是我仍在努力将消息的模式扩展到多行。

## reg expressions to match different things in the log
date = r'\[\d+\.\d+\.\d+,'
time = r'\d+\:\d+\:\d+]'
message = r':\s+.+\['
message = re.compile(message, re.DOTALL)

请注意,我的日志来自德语WhatsApp,这就是为什么日期有些不同的原因。另外,我以和为结尾,以确保不会意外从邮件中获得匹配项。

我想通过在[通常是下一行的开始处(但如果可以在新行的消息中找到它的话,可能并不那么健壮)。 / p>

也许有一种更简单的解决方案,但是我(如您所见)真的对正则表达式不好。

2 个答案:

答案 0 :(得分:0)

以下是使用re.findall的常规正则表达式和解决方案:

msg = "[19.09.17, 19:54:48] Marc: If the mean is not in the thousands, there's the problem
    [19.09.17, 19:54:59] Joe: > mean(aging$Population)
    [1] 1593.577\nIs what I get as solution"

results = re.findall(r"\[(\d{2}\.\d{2}\.\d{2}), (\d{2}:\d{2}:\d{2})\] ([^:]+): (.*?)(?=\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\]|$)", msg, re.MULTILINE|re.DOTALL)

for item in results:
    print "date: " + item[0]
    print "time: " + item[1]
    print "sender: " + item[2]
    print "message: " + item[3]

date: 19.09.17
time: 19:54:48
sender: Marc
message: If the mean is not in the thousands, there's the problem
date: 19.09.17
time: 19:54:59
sender: Joe
message: > mean(aging$Population)

该模式看上去很长而且很肿胀,刚好符合您所期望的WhatsApp消息的结构。值得注意的是,该模式同时使用多行和DOT ALL模式。对于可能跨越多行的消息,这是必需的。当模式看到下一条消息的开始(特别是时间戳记)或输入的结尾时,该模式就停止使用给定的消息。

答案 1 :(得分:0)

劫持了上面的东西,以防万一,我只是从蒂姆·比格莱森(Tim Biegeleisen)裁剪了正则表达式

results = re.findall(r"\[(\d{2}\.\d{2}\.\d{2}), (\d{2}:\d{2}:\d{2})\] ([^:]+): (.*?)(?=\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\])", msg, re.MULTILINE|re.DOTALL)