使用正则表达式解析Whatsapp聊天日志

时间:2019-03-08 16:02:46

标签: python regex regex-lookarounds regex-group python-regex

我正在尝试使用正则表达式解析whatsapp聊天日志。我有一个适用于大多数情况的解决方案,但我正在寻求改进,但不知道如何解决,因为我是regex的新手。

chat.txt文件如下所示:

[06.12.16, 16:46:19] Person One: Wow thats amazing
[06.12.16, 16:47:13] Person Two: Good morning and this goes over multiple
lines as it is a very long message
[06.12.16, 16:47:22] Person Two: ::

尽管到目前为止,我的解决方案可以正确解析其中的大多数消息,但是与上面的最后一个示例一样,我有数百种情况下消息以冒号开头。这将导致Person Two: :的不必要值作为发件人。

这是到目前为止我正在使用的正则表达式:

pattern = re.compile(r'\[(?P<date>\d{2}\.\d{2}\.\d{2}),\s(?P<time>\d{2}:\d{2}:\d{2})]\s(?P<sender>(?<=\s).*(?::\s*\w+)*(?=:)):\s(?P<message>(?:.+|\n+(?!\[\d{2}\.\d{2}\.\d{2}))+)')

任何有关如何解决此错误的建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

我在构建 tool 来分析 WhatsApp 聊天时遇到了类似的问题。

主要问题是 chat.txt 的格式取决于您的系统语言。在德语中,您会看到 16:47,但在英语中,它可能是 PM,而且美国用户的月份格式会发生变化......

我使用的 library 有以下 4 个正则表达式。到目前为止,它们涵盖了所有发生的案例(拉丁语)。

过滤一般:

const regexParser = /^(?:\u200E|\u200F)*\[?(\d{1,4}[-/.] ?\d{1,4}[-/.] ?\d{1,4})[,.]? \D*?(\d{1,2}[.:]\d{1,2}(?:[.:]\d{1,2})?)(?: ([ap]\.? ?m\.?))?\]?(?: -|:)? (.+?): ([^]*)/i;

过滤系统消息:

const regexParserSystem = /^(?:\u200E|\u200F)*\[?(\d{1,4}[-/.] ?\d{1,4}[-/.] ?\d{1,4})[,.]? \D*?(\d{1,2}[.:]\d{1,2}(?:[.:]\d{1,2})?)(?: ([ap]\.? ?m\.?))?\]?(?: -|:)? ([^]+)/i;

日期:

const regexSplitDate = /[-/.] ?/;

处理附件,即使您导出不带附件的聊天,也会在“< >”中传递附件。 (例如

const regexAttachment = /<.+:(.+)>/;`

答案 1 :(得分:0)

在应用正则表达式之前,我会预处理列表以删除连续的冒号。所以对于每一行,例如

 line = [06.12.16, 16:47:22] Person Two: ::
 line = line.replace("::","")

这将给:

[06.12.16, 16:47:22] Person Two: 

然后您可以对预处理后的数据调用正则表达式。