使用RegExp

时间:2018-08-03 23:51:39

标签: python regex telegram

我有一个文件,用于在Telegram上保存提取的消息。每封邮件都以日期开头,包含时间,用户名和他/她发送的邮件:

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列表中,这样列表的每个条目将是消息,其中存储了日期,时间和用户名在列表中。像这样:

list = [
  '08.04.2018 15:50:14, Vlada: Ey, hello there.\n\nhows it going?\nEverything fine?\n',
  '08.04.2018 15:53:30, Other: Meh\ncould have been better.\n',
  '08.04.2018 15:55:20, Vlada: ok'
]

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

我的尝试

我去了,并开始在日志的开头搜索日期模式,因此,我将所有换行符与任何字符都包括在内,并希望所有这些换行符,直到我碰到另一个日期模式为止。

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

我所挣扎的是具有reg表达式的“如何遍历那些元素”的能力,以实现我上面提到的结果,并且使用我想出的一种方法,它不包含最后一条消息完全没有。

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

我使用的是Python 2.7,Windows 10。

2 个答案:

答案 0 :(得分:1)

此解决方案在带有Pyton 2.7.10的MacAir中进行了尝试。它应该足够接近Windows 10上的Python 2.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)

结果:

[
'08.04.2018 15:50:14, Vlada: Ey, hello there.\n\nhows it going?\nEverything fine?\n',
'08.04.2018 15:53:30, Other: Meh\ncould have been better.\n',
'08.04.2018 15:55:20, Vlada: ok'
]    

详细信息:

首先,data.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标志匹配,从而使.与任何字符匹配,包括换行符。正则表达式与您尝试过的正则表达式非常相似,除了它在?之后使用*使其变得非贪婪。而且,它使用|来使$(字符串的结尾)成为比赛的替代结尾。

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

编辑:我在正向前进\n之后的正则表达式中添加了?=新行字符,以消除结果中消息之间的空行。这是来自@lenik的评论,因此我的结果将与您的“类似以下内容:”列表完全匹配。

此外,我从bash shell上的执行中删除了输出,因为它不是必不可少的,尤其是因为您使用的是Windows 10。

答案 1 :(得分:1)

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

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为原始文本,结果为:

[
    "08.04.2018 15:50:14, Vlada: Ey, hello there.\n\nhows it going?\nEverything fine?\n", 
    "08.04.2018 15:53:30, Other: Meh\ncould have been better.\n", 
    "08.04.2018 15:55:20, Vlada: ok"
]