我在探索导出的 WhatsApp 聊天数据集时遇到了正则表达式障碍

Posted

技术标签:

【中文标题】我在探索导出的 WhatsApp 聊天数据集时遇到了正则表达式障碍【英文标题】:I hit a regex roadblock while exploring a dataset of exported WhatsApp chats 【发布时间】:2021-08-20 22:36:08 【问题描述】:

我正在创建导出的 WhatsApp 聊天数据集。为了操作数据,我需要将聊天记录的每一行拆分为datetimesendermessage(列)。

import pandas as pd
import re

column_names = ["date", "time", "sender", "message"]
data = pd.read_table("datasets/WhatsApp Chat with Makay.txt", sep="re.split(', |- |:', data2)", names = column_names)
data.head()

输出:整行/字符串进入日期列,而时间,发件人 和消息都返回 NaN 值。

这正是字符串的一个示例:

string: '04/10/2020, 12:34 - Sender: Alright. This is the "message", with multiple de-limiters.'

预期输出:['04/10/2020', '12:34', 'Sender', '好吧。这是 “消息”,带有多个分隔符。']

我尝试了以下模式:

re.split(', |-|:', string)

re.split('\d\d[- /.]\d\d[- /.]\d\d\d\d[- /.] *?|, *?|- *?|: ', string)

re.split('\d\d[- ./]\d\d[- ./]\d\d\d\d[- ./]|, |- |: ', string)

但他们都失败了。其他类似标记的问题似乎没有回答这个特定的问题。我还访问了 regex101 网络应用程序,但找不到解决方案。有什么帮助吗?

【问题讨论】:

【参考方案1】:

您可以匹配 4 个捕获组中的所有不同部分,而不是使用拆分。

^(\d2/\d2/\d4), (\d2:\d2) - ([^:]+):\s*(.+)
^ 字符串开头 (\d2/\d2/\d4) Capture group 1 匹配日期格式(你可以更具体) , 字面匹配 (\d2:\d2) Capture group 2 匹配 timelike 格式 (你也可以更具体) - 字面匹配 ([^:]+) 捕获 group 3 匹配除 : 之外的任何字符 1 次以上 :\s* 匹配 : 和可选的空白字符 (.+) 捕获 group 4 匹配任何字符 1 次以上

Regex demo

import pandas as pd
import re

column_names = ["date", "time", "sender", "message"]
with open('datasets/WhatsApp Chat with Makay.txt', 'r', encoding="utf8") as file:
    items = re.findall(
        r"^(\d2/\d2/\d4), (\d2:\d2) - ([^:]+):\s*(.+)",
        file.read(),
        re.MULTILINE
    )

    df = pd.DataFrame(items, columns=column_names)
    pd.set_option('display.max_colwidth', None)

    print(df)

输出

         date   time  sender                                                     message
0  04/10/2020  12:34  Sender  Alright. This is the "message", with multiple de-limiters.

【讨论】:

当我在示例字符串上测试匹配模式时,它的效果非常好。但是,我收到“ValueError:对已关闭文件的 I/O 操作”。当我在数据集上测试它时,在第 7 行。 @Sillette 你能用更新后的代码试试吗? 遇到另一个错误:“UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 4096: character maps to ”在第 6 行,我不知道这是什么意思跨度> @Sillette 如果你使用with open('datasets/WhatsApp Chat with Makay.txt', 'r', encoding="utf8") as file: 我放弃了这个测试项目好几个星期,因为我自己无法弄清楚。你在一小时内解决了我的难题。提出的第一个问题,完美的回答,非常感谢您的努力。

以上是关于我在探索导出的 WhatsApp 聊天数据集时遇到了正则表达式障碍的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的应用出现在其他应用的共享板中 - 例如whatsApp

Android Whatsapp/聊天示例 [关闭]

实现 ios 聊天(如whatsapp):websocket?

从 WinForm C# 在 WhatsApp 桌面聊天中添加文件

Laravel 5 android 聊天与推送通知,如 Whatsapp

whatsapp 聊天机器人不在 Heroku 中运行