用RegExp拆分电报消息

2024-10-03 17:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,里面保存着电报上的摘录信息。每条信息以日期、时间、用户名和他/她发送的消息开头:

08.04.2018 15:50:14, Vlada: Ey, hello there.

hows it going?
Everything fine?

08.04.2018 15:53:30, Other: Meh
could have been better.

08.04.2018 15:55:20, Vlada: ok

现在,我想将这个大字符串(从一个文件)拆分成子字符串,这些子字符串将被插入python列表中,这样列表中的每个条目都将是消息(带有日期、时间和用户名)存储在列表中。像这样:

^{pr2}$

稍后我将对这些字符串执行一些额外的逻辑,但首先我必须以这种方式对它们进行排序。在

我的尝试

我开始在日志的开始处搜索日期模式,这样,我就包含了所有包含任何字符的换行符,我希望它们都是,直到我找到另一个日期模式为止。在

/(\n\d{2}\.\d{2}\.\d{4})(?s)(.*)(?=(\n\d{2}\.\d{2}\.\d{4}))/g

我所挣扎的是“如何循环这些元素”的能力,为了达到我上面提到的结果,我想出了一个方法,它根本不包括最后一条消息。在

我想尝试的另一件事是找到第一条消息的开头和结尾,在列表中插入一个字符串,然后从文件中删除整个字符串,但我觉得这样做不是很好的方法。在

我使用Python2.7,Windows10。


Tags: 文件方法字符串信息消息hello列表时间
2条回答

这个解决方案在Pyton 2.7.10的MacAir中试用过。它应该足够接近Windows10上的Python2.7。在

解决方案:

with open('data.txt', 'r') as myfile:
    data=myfile.read()

import re

p = re.compile('(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},(?s).*?)(?=\n\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},|$)')

l = p.findall(data)

结果:

^{pr2}$

详细信息:

首先,数据.txt包含您的数据,并将其作为字符串读入名为data的变量中。正则表达式:

(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},(?s).*?)(?=\n\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},|$)

已编译。(?s)s,DOTALL,标志匹配模式的其余部分,这使得.匹配任何字符,包括换行符。该正则表达式与您尝试的非常相似,只是它在*后面使用?使其成为非gree。另外,它使用|使$(字符串的结尾)成为匹配的另一个结尾。在

最后,findall()用于查找重新匹配的所有子字符串,并将它们作为列表返回。在

编辑:我在正则表达式中添加了一个\n,新行,字符,就在“积极展望”之后,?=,以便从结果中消除消息之间的空行。这是来自@lenik的评论的结果,这样我的结果将与你的“类似这样的事情:”列表完全匹配。在

另外,我在bashshell上执行时删除了输出,因为它不是必需的,特别是因为您使用的是windows10。在

一种更简单的方法,可以得到所需的结果:

import re

result = []
for i in data.split('\n') :    # data   is your original text
    if re.search( r'^\d\d\.\d\d\.\d\d\d\d', i) is None :
        result[-1] += '\n' + i
    else :
        result.append(i)

假设data有原始文本,则结果:

^{pr2}$

相关问题 更多 >