我有一个包含如下数据的 .txt 文件:
[12.06.17, 13:18:36] Name1: Test test test
[12.06.17, 13:20:20] Name2 ❤️: blabla
[12.06.17, 13:20:44] Name2 ❤️: words words words
words
words
words
[12.06.17, 13:29:03] Name1: more words more words
[12.06.17, 13:38:52] Name3 Surname Nickname:
[12.06.17, 13:40:37] Name1: message?
请注意,消息前可能会有多个名称,并且可以出现多行消息。我已经尝试了许多方法来将数据分成“日期”,“时间”,“名称”和“消息”组。 我已经能够找到这个正则表达式。
(.)(\d+\.\d+\.\d+)(,)(\s)(\d+:\d+:\d+)(.)(\s)([^:]+)(:)
能够捕获到消息之前的所有内容(参见:https://regex101.com/r/hQlgeM/3)。但我无法弄清如何添加消息,以便将多行消息分组到上一条消息中。
最后:如果我能够使用正则表达式从.txt文件中捕获每个组,那么我该如何将每个组传递到单独的列中。我已经查看了三天的示例,但仍然无法弄清如何最终构建此数据帧。
我尝试使用的代码:
df = pd.read_csv('chat.txt', names = ['raw'])
data = df.iloc[:,0]
re.match(r'\[([^]]+)\] ([^:]+):(.*)', data)
另一种尝试失败了:
input_file = open("chat.txt", "r", encoding='utf-8')
content = input_file.read()
df = pd.DataFrame(content, columns = ['raw'])
df['date'] = df['raw'].str.extract(r'^(.)(\d+\.\d+\.\d+)', expand=True)
df['time'] = df['raw'].str.extract(r'(\s)(\d+:\d+:\d+)', expand=True)
df['name'] = df['raw'].str.extract(r'(\s)([^:]+)(:)', expand=True)
df['message'] = df['raw'].str.extract(r'^(.)(?<=:).*$', expand=True)
df
(?s)(\[)(\d+\.\d+\.\d+)(,)(\s)(\d+:\d+:\d+)(])(\s)([^:]+)(:)(.*?)(?=\[\d+\.\d+\.\d+,\s\d+:\d+:\d+]|\Z)
,参见demo。你确定需要这么多组吗?我宁愿像这里那样使用它们。 - Wiktor Stribiżewstr.extract
和命名组,参见 https://regex101.com/r/K4ri2M/3 - Wiktor Stribiżew