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

Python 使用正则表达式解析Whatsapp聊天日志,python,regex,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 mes

我正在尝试使用正则表达式解析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: ::
虽然到目前为止,我的解决方案能够正确解析这些消息中的大部分,但是我有几百种情况,其中消息以冒号开头,如上面的最后一个示例。这会导致不需要的值
第二个人::
作为发送者

以下是我目前正在使用的正则表达式:

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}))+)')

pattern=re.compile(r'\[(?P\d{2}\.\d{2}.\d{2}),\s(?P\d{2}:\d{2})]\s(?P(?

i将在应用正则表达式之前预处理列表以删除连续的冒号

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

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

然后,您可以对预处理的数据调用regex函数。

在应用regex之前,我会预处理列表以删除连续的冒号

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

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

然后,您可以对预处理的数据调用regex函数。

在构建分析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 regexAttachment=/`

我在构建分析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 regexAttachment=/`

我看不出您当前的案例有什么问题,不是吗?应该是什么?为什么?正如我所说,只有在第一个冒号后面有一个额外的冒号,导致“发件人”输出为“第二个人:”,问题才会出现但这不正常吗?
第二个人
是发送者。给定字符串的预期输出是什么?这只是添加到发送者列中的第二个冒号。例如,我在发送者列中有三行是“第二个人”,然后另一行是“第二个人:”这不是分析数据的理想方法。同样,您只捕获了
第二个人
,请仔细查看。第3组中没有冒号。我看不出您当前的案例有问题,不是吗?预期的是什么,为什么?正如我所说,只有在第一个冒号之后有一个额外的冒号,导致“发送者”输出被忽略时,才会出现问题“Person Two::”但这不正常吗?
Person Two
是发送方。给定字符串的预期输出是什么?只是添加到发送方列中的第二个冒号。例如,我在发送方列中有三行是“Person Two”,然后另一行是“Person Two:”这对于分析数据来说并不理想。同样,您只捕获了
第二个人
,请仔细查看。第3组中没有冒号。这会改变消息正文。第二个冒号显然是已发送消息的一部分,我不想在那里更改任何内容。但这会改变消息正文。第二个冒号是很明显,这是已经发出的信息的一部分,我真的不想改变那里的任何东西。