Совпадение сообщений из журнала WhatsApp в python - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы извлечь все шаблоны, которые соответствуют сообщению в WhatsApp.Сообщения имеют следующую форму:

Однострочное сообщение:

[19.09.17, 19:54:48] Marc: If the mean is not in the thousands, there's the problem

Многострочное сообщение:

[19.09.17, 19:54:59] Joe: > mean(aging$Population)
[1] 1593.577
Is what I get as solution

Я смог разделить его на Дата, Время, Отправитель и Сообщение, но только для однострочников, сначала прочитав строку текстового файла для строки, а затем разделив эти строки на разные разделители.Однако это не работает для сообщений с несколькими строками.Сейчас я пытаюсь использовать регулярные выражения, с помощью которых мне удалось получить даты и время, но я все еще пытаюсь расширить шаблон для сообщений до нескольких строк.

## reg expressions to match different things in the log
date = r'\[\d+\.\d+\.\d+,'
time = r'\d+\:\d+\:\d+]'
message = r':\s+.+\['
message = re.compile(message, re.DOTALL)

Обратите внимание, что мой журнал написан на немецком языке WhatsApp, поэтому даты немного отличаются.Кроме того, я закончил на, и], чтобы убедиться, что я не получаю совпадения из сообщений.

Я хотел бы сделать то же самое с шаблоном сообщения, заканчиваясь на [, который обычно является началомследующая строка (но может быть не очень надежной, если это можно найти в сообщении на новой строке).

Возможно, есть более простое решение, но я (как вы можете видеть) действительно плохо с регулярным выражением.

Ответы [ 2 ]

0 голосов
/ 13 августа 2019

Перехватывая вышеупомянутое, чтобы соответствовать в случае многострочного, я просто обрезал регулярное выражение от Тима Бигелайзена

results = re.findall(r"\[(\d{2}\.\d{2}\.\d{2}), (\d{2}:\d{2}:\d{2})\] ([^:]+): (.*?)(?=\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\])", msg, re.MULTILINE|re.DOTALL)
0 голосов
/ 09 декабря 2018

Вот общее регулярное выражение и решение с использованием re.findall:

msg = "[19.09.17, 19:54:48] Marc: If the mean is not in the thousands, there's the problem
    [19.09.17, 19:54:59] Joe: > mean(aging$Population)
    [1] 1593.577\nIs what I get as solution"

results = re.findall(r"\[(\d{2}\.\d{2}\.\d{2}), (\d{2}:\d{2}:\d{2})\] ([^:]+): (.*?)(?=\[\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2}:\d{2}\]|$)", msg, re.MULTILINE|re.DOTALL)

for item in results:
    print "date: " + item[0]
    print "time: " + item[1]
    print "sender: " + item[2]
    print "message: " + item[3]

date: 19.09.17
time: 19:54:48
sender: Marc
message: If the mean is not in the thousands, there's the problem
date: 19.09.17
time: 19:54:59
sender: Joe
message: > mean(aging$Population)

Шаблон, который выглядит длинным и раздутым, просто соответствует структуре вашего ожидаемого сообщения WhatsApp.Следует отметить, что шаблон использует как многострочный, так и режим DOT ALL.Это необходимо для сообщений, которые могут занимать несколько строк.Шаблон перестает использовать данное сообщение, когда либо видит начало следующего сообщения (в частности, отметку времени), либо видит конец ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...