[英]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.