Регулярное выражение не соответствует шаблону - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать регулярное выражение для следующих данных

12/07/16, 2:18 AM - ABC1: Anyway... this is ... abc: !?

:) Yea, this is next line - Multi line statements
12/07/16, 2:19 AM - User27: John, Bob, Him, I, May,2 ,3 100... multiple values
10/07/16, 2:41 PM - ABC1: Singe line statements
10/07/16, 2:41 PM - ABC1: Good
10/07/16, 2:45 PM - ABC1: Emojis statements, multiline, different languages
??????

?????????

My Regex -

(\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s

Вышеупомянутое регулярное выражение прекрасно работает до

12/07/16, 2:18 AM - 

Моя попытка обработать последний бит (имя пользователя + сообщение) -

(\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s(^[A-Z][0-9]$)

Не удается выбрать сообщение или имя пользователя.

Я пытаюсь создать регулярное выражение для фрагмента сообщения, так как онозадействует символы новой строки, пробелы, смайлики, разные языки, и я не знаю длины имени пользователя или сообщения.

Я использую Отладчик для проверки моего регулярного выражения и этого Шпаргалка

Я открыт для любых улучшений и предложений.Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вам не нужно читать весь файл в память.Вы можете читать файл построчно, проверяя, соответствует ли ваш шаблон начальной строки, затем продолжать добавлять строки во временную строку, если они не начинаются с этого шаблона, и добавлять к результату (или записывать в другой файл, в информационный кадр,и т. д.) когда будет найден конец файла или другой строки, соответствующей вашему шаблону даты и времени:

import re
values = []
start_matching = False
val = ""
r=re.compile(r"\d{1,2}/\d{2}/\d{2},\s\d{1,2}:\d{2}\s\w{2}\s-\s")
with open('path/to/file', 'r') as f:
  for line in f:
    if r.match(line.strip()):
      start_matching = True
      if val:
        values.append(val.rstrip()) # stripping trailing whitespace and write to result
        val = ""
      val += line
    else:
      if start_matching:
        val += line

if val:
  values.append(val.rstrip()) # stripping trailing whitespace and write the tail to result

Если вы используете

for v in values:
  print(v)
  print("-------")

, результат будет

12/07/16, 2:18 AM - ABC1: Anyway... this is ... abc: !?

:) Yea, this is next line - Multi line statements
-------
12/07/16, 2:19 AM - User27: John, Bob, Him, I, May,2 ,3 100... multiple values
-------
10/07/16, 2:41 PM - ABC1: Singe line statements
-------
10/07/16, 2:41 PM - ABC1: Good
-------
10/07/16, 2:45 PM - ABC1: Emojis statements, multiline, different languages
??????

????????
-------
0 голосов
/ 22 мая 2019

Это немного изменяет ваше регулярное выражение

(?s)(\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s(User\d+):\s*(.*?)(?=(\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s|\Z)

Распределение регулярных выражений

(?s) #Dot matches new line
(\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s #Same as above
(User\d+)\s*:\s* #Match username followed by :
(.*?) #Find the message lazily till the below conditions
(?=
   (?:\d{1,2}\/\d{2}/\d{2})\,\s(\d{1,2}\:\d{2}\s\w{2})\s\-\s  #Till the same format is found
   |
  \Z #or we reach end of string
)

РЕДАКТИРОВАТЬ : Как уже упоминалось в комментарии, файл должен находиться в памяти в одной переменной

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