#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 типа типов сообщений:
- С номерами телефонов => r1
- Без номеров телефонов => 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