Split the file into parts according to the ^{date}\t{title}\t pattern:
#!/usr/bin/env python3 import re from pathlib import Path text = Path('messages.txt').read_text() date_re = r'\d\d\.\d\d\.\d{4}' title_re = r'[^\t]+' # no tab in the title parts = re.split(f'^({date_re})\t({title_re})\t', text, flags=re.M)[1:] print(*parts, sep=' | ')
Conclusion (abbreviated) for the example in question:
30.01.2017 | Первое сообщение | ... | 30.01.2017 | Второе сообщение | ... | 30.01.2017 | Третье сообщение | ...
Or more strictly, you can check that all dates are resolved and put each message in its object with named attributes:
from collections import namedtuple from datetime import datetime Message = namedtuple('Message', 'date title message') triples = (parts[i:i+3] for i in range(0, len(parts), 3)) messages = [Message(datetime.strptime(datestr, '%d.%m.%Y').date(), title, text) for datestr, title, text in triples] print(*messages, sep='\n')
Result
Message(date=datetime.date(2017, 1, 30), title='Первое сообщение', message='Текст первого сообщения, не содержащий табуляции или переноса строки\n') Message(date=datetime.date(2017, 1, 30), title='Второе сообщение', message='Текст второго сообщения с\tтабуляцией\n') Message(date=datetime.date(2017, 1, 30), title='Третье сообщение', message='Текст третьего сообщения\nс переносом строки\nи\tтабуляцией\n')
PHP,JAVAandpython). - fonjeekay