繁体   English   中英

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

[英]Whatsapp chat log parsing with regex

我正在尝试使用正则表达式解析 WhatsApp 聊天日志。 我有一个适用于大多数情况的解决方案,但我希望改进它,但不知道如何改进,因为我对正则表达式很陌生。

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: :的不必要的价值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}))+)')

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

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

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

这会给:

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

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

在构建分析 WhatsApp 聊天的工具时,我遇到了类似的问题。

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

我使用的有以下 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 = /[-/.] ?/;

处理在“< >”中传递的附件,即使您导出没有附件的聊天也是如此。 (例如 <media ommitted>)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM