По умолчанию .
не будет соответствовать новой строке. Вам нужно использовать режим DOTALL , чтобы он соответствовал символам новой строки:
re.findall('(\d+/\d+/\d+, \d+:\d+\d+) - (.+?): (.*)', f.read(), re.DOTALL)
Работает:
>>> import re
>>> s="""
... 20/01/18, 09:01 - Peter: Good
...
... I had some problems few days ago.
...
... Now I am happy
...
... Are you working?"""
>>> re.findall('(\d+/\d+/\d+, \d+:\d+\d+) - (.+?): (.*)', s, re.DOTALL)
[('20/01/18, 09:01', 'Peter', 'Good\n\nI had some problems few days ago.\n\nNow I am happy\n\nAre you working?')]
>>> _
Это не решает проблему соответствия всего остальноготекста!
См. ответ @ the четвертой птицы для реального решения.
Другое. Более явный способ справиться с этим - читать файл построчно и проверять, является ли строка продолжением.
rx = re.compile('^(\d+/\d+/\d+, \d+:\d+\d+) - (.+?): (.*)$') # Note the ^.
texts = []
for line in input_file: # Files iterate line by line.
new_match = rx.match(line)
if new_match:
texts.append(list(new_match.groups())) # We want a list
else:
# We have a continuation line; append it to the last item of group.
last = texts[-1]
last[-1] += line # Update in-place.
Об этом может быть проще подумать.