Код регулярных выражений для перехвата сообщений WhatsApp с датами включительно

#python #regex

#python #регулярное выражение

Вопрос:

Я написал скрипт на Python для анализа отправляемого журнала группового чата WhatsApp и автоматического извлечения необходимых мне данных в Google Sheets. Я использовал регулярное выражение, чтобы отделить дату время отправителя от сообщения:

^(dd/dd/dddd,.*?)(?=^^dd/dd/dddd|Z) .

Я также попробовал предложение по переполнению стека:

 ^
(?P<datetime>d{2}/d{2}/d{4}[^-] )s -s 
(?P<name>[^:] ):s 
(?P<message>[sS] ?)
(?=^d{2}|Z)
 

Оба выражения работают нормально, пока сообщение не содержит введенную дату. есть ли способ обойти это?

Фрагмент текстовой строки:

 03/01/2021, 10:06 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more.
21/06/2018, 07:47 -  234 806 679 5599 created group "Keremor Barging"
03/01/2021, 08:48 - John C. added you
03/01/2021, 08:49 -  234 703 803 5040: Waiting for this message
04/01/2021, 08:06 -  234 703 803 5040:Ugo-Ocha Terminal.           

No STS operation was carried out.

Total volume Onboard Ugo Ocha As at 0800hrs 04/01/2021 remain the same
 
 

Комментарии:

1. Можете ли вы указать, что делает ваш RE, когда в сообщении есть дата?

2. А также, что бы вы хотели получить в этом последнем блоке из пяти строк? Одно сообщение из 5 строк?

3. Вы должны представить свой ожидаемый ввод и отметить нарушения, а также представить желаемый результат / совпадения. В нынешнем виде очень сложно угадать желаемый результат.

4. Во всяком случае, регулярное выражение работает для дат в теле сообщения, поэтому ваш вопрос ошибочен. regex101.com/r/Rm8u4j/1

5. @MonkeyZeus спасибо за комментарий. Я понял, что моя тестовая строка была неточной. regex101.com/r/lvV8gR/1 . Ссылка показывает проблему.

Ответ №1:

 #!/usr/bin/python3
# -*- coding: utf-8 -*-

import re

input = """
03/01/2021, 10:06 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more.
21/06/2018, 07:47 -  234 806 679 5599 created group "Keremor Barging"
03/01/2021, 08:48 - John C. added you
03/01/2021, 08:49 -  234 703 803 5040: Waiting for this message
04/01/2021, 08:06 -  234 703 803 5040:Ugo-Ocha Terminal.    
"""

r1 = r"([0-9]{2}/[0-9]{2}/[0-9]{4},s [0-9]{2}:[0-9]{2})s -s ( [0-9s] [0-9]{1}):?s*([^$] )$"
r2 = r"([0-9]{2}/[0-9]{2}/[0-9]{4},s [0-9]{2}:[0-9]{2})s -s ([^$] )$"

lines = re.compile(r"n").split(input)
for line in lines:
    if line!= '':
        m = re.match(r1, line)
        if m:
            print("<datetime>" m.group(1) "<phone>" m.group(2) "<message>" m.group(3))
        else:
            m = re.match(r2, line)
            if m:
                print("<datetime>" m.group(1) "<message>" m.group(2))
 

Что-то вроде этого, существует 2 типа типов сообщений:

  1. С номерами телефонов => r1
  2. Без номеров телефонов => r2

вывод:

 <datetime>03/01/2021, 10:06<message>Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more.
<datetime>21/06/2018, 07:47<phone> 234 806 679 5599<message>created group "Keremor Barging"
<datetime>03/01/2021, 08:48<message>John C. added you
<datetime>03/01/2021, 08:49<phone> 234 703 803 5040<message>Waiting for this message
<datetime>04/01/2021, 08:06<phone> 234 703 803 5040<message>Ugo-Ocha Terminal.
 

Редактировать: попробуйте с этим, добавленная запятая необязательна

 ^(dd/dd/dddd,?.*?)(?=^^dd/dd/dddd|Z)
 

Комментарии:

1. Привет, Зитал, вот ссылка на проблему. regex101.com/r/lvV8gR/1

2. @EbenezarOkezie-Alaukwu запятая необязательна, попробуйте это: regex101.com/r/KZtIw4/1