我有一个文件,用于在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。
答案 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"
]