我正在尝试使用正则表达式解析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}))+)')
任何有关如何解决此错误的建议将不胜感激!
答案 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:
然后您可以对预处理后的数据调用正则表达式。