Найти все экземпляры в тексте, последнее слово также должно быть началом поиска с регулярным выражением для python

Я не могу найти решение проблемы с регулярным выражением, которая у меня есть. На самом деле это своего рода дополнительный вопрос к этому сообщению: end-of-file">Найти строку между двумя подстроками И между строкой и концом файла

Я создал следующий пример текста (в моем приложении текст намного длиннее и содержит несколько файлов и т. д.):

Курс 22/09/2010 1. Раннее дежурство Жозефина, Янсен 22-09-2010 10:37:08 Дата 22/09/2010 Дежурство 1. Раннее дежурство 1.3 Здесь могут быть некоторые другие сопутствующие вещи Nursegoals Interventions Record Это теперь четвертое примечание. 6.2.1.3 Замешательство: наблюдение. Запись вмешательств Nursegoals Это новая заметка (снова), я называю ее заметкой 3. Курс 22/09/2010 1. Запись раннего дежурства Это снова заметка, я называю ее заметкой 2. Apple: 0/меньше Курс 22/ 09/2010 3. Ночное дежурство Жозефина, Янсен 22-09-2010 06:22:25 Дата 22/09/2010 Курс 3. Ночное дежурство 1.3 Что-то еще здесь Nursegoals Запись вмешательств 6.2.1.3 Замешательство: наблюдение. Курс записи вмешательств Nursegoals 22/09/2010 3. Запись ночного дежурства Это новая заметка, я называю ее заметкой 1.

Теперь я хочу проанализировать конкретную информацию из этого текста. Меня интересует «Запись», поэтому текстовая часть, которая стоит за записью. и дату для этой конкретной записи, под которой я имею в виду дату, например 11.02.2010, и понятие раннего дежурства, позднего дежурства или ночного дежурства (таким образом, дата будет: «09-02-2010 1. Раннее дежурство» ). У меня проблема в том, что в файлах нет реальной согласованности, поэтому иногда есть 2 заметки для одной даты, а иногда только одна. Также иногда раздел заметок содержит текст, а иногда нет.

Я знаю, как анализировать раздел «Запись», но я не знал, как сначала анализировать дату, а затем раздел (ы) заметок. Поэтому я решил разделить проблему на две части. Мой первый шаг — разделить весь файл на отдельные разделы даты. Второй шаг: переберите все разделы даты, чтобы получить примечания для этого конкретного раздела даты (с регулярным выражением). Затем я бы сделал своего рода список, который содержал бы конкретную дату (если бы мне нужна была только конкретная дата, чтобы поместить ее в ячейку столбца, например, я бы просто проанализировал первые 13 символов этого раздела даты.) и примечание (s), которые связаны с этой датой. Например:

list = [08-02-2010 1. Раннее дежурство, [примечание1, примечание2], 08-02-2010 2. Позднее дежурство, [примечание1] и т. д.]

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

date = r'Course\s+(.*?)(?:Course|$)'
date_list = re.findall(date, text, re.DOTALL)
for i in date_list: 
   print (i)
   print ('XXX')

Результат:

22/09/2010 1. Досрочное дежурство Жозефина, Янсен 22-09-2010 10:37:08 Дата22/09/2010 Дежурство 1. Раннее дежурство 1.3 Здесь могут быть некоторые другие сопутствующие вещи Nursegoals Interventions Record Это теперь четвертое примечание . 6.2.1.3 Замешательство: наблюдение. Запись вмешательств Nursegoals Это новое, примечание (снова), я называю его примечанием 3. XXX 22/09/2010 3. Nightduty Josephine, Jansen 22-09-2010 06:22:25 Дата 22/09/2010 XXX 22/ 09/2010 3. Nightduty Record Это новая заметка, я называю ее заметка 1. XXX

В этом выводе отсутствуют следующие элементы:

['Курс 22/09/2010 1. Запись раннего дежурства Это снова заметка, я называю ее заметкой 2. Apple: 0/меньше']

а также

['3. Nightduty 1.3 Что-то еще здесь Nursegoals Запись вмешательств 6.2.1.3 Замешательство: наблюдение. Медсестринские вмешательства]

Так что это как бы перескакивает, так как я думаю, что регулярное выражение не рассматривает конец слова «Курс», а также как начало нового, так сказать, совпадения.

Было бы здорово, если бы кто-нибудь мог мне помочь :) Возможно, я что-то упускаю..


person jjn    schedule 12.04.2017    source источник


Ответы (1)


Измените незахватывающую группу на позитивную:

r'Course\s+(.*?)(?=Course|$)'
                 ^^

См. демонстрацию регулярного выражения. Развернутый, более быстрый вариант — r'Course\s+([^C]*(?:C(?!ourse)[^C]*)*)' (см. демонстрацию).

В противном случае перекрывающиеся подстроки не сопоставляются.

демонстрация Python:

import re
rx = r"Course\s+(.*?)(?=Course|$)"
s = "Course 22/09/2010 1. Early duty Josephine, Jansen 22-09-2010 10:37:08 Date 22/09/2010 Duty 1. Early duty 1.3 Here there can be some other related stuff Nursegoals Interventions Record This is now the fourth note. 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record This is a new, note (again), i call it note 3. Course 22/09/2010 1. Early duty Record This is again a note, i call it note 2. Apple: 0/less Course 22/09/2010 3. Nightduty Josephine, Jansen 22-09-2010 06:22:25 Date 22/09/2010 Course 3. Nightduty 1.3 Something else here Nursegoals Interventions Record 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record Course 22/09/2010 3. Nightduty Record This is a new note, i call it note 1."
results = re.findall(rx, s, re.DOTALL)
for x in results:
    print(x)

Выход:

22/09/2010 1. Early duty Josephine, Jansen 22-09-2010 10:37:08 Date 22/09/2010 Duty 1. Early duty 1.3 Here there can be some other related stuff Nursegoals Interventions Record This is now the fourth note. 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record This is a new, note (again), i call it note 3. 
22/09/2010 1. Early duty Record This is again a note, i call it note 2. Apple: 0/less 
22/09/2010 3. Nightduty Josephine, Jansen 22-09-2010 06:22:25 Date 22/09/2010 
3. Nightduty 1.3 Something else here Nursegoals Interventions Record 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record 
22/09/2010 3. Nightduty Record This is a new note, i call it note 1.
person Wiktor Stribiżew    schedule 12.04.2017
comment
Это то, что я искал! Отличный ответ, особенно с демонстрацией регулярных выражений (я не знал об этом). Большое спасибо:) - person jjn; 12.04.2017
comment
Рад, что это сработало для вас. Также рассмотрите возможность проголосовать, если мой ответ оказался для вас полезным (см. Как проголосовать за стек Переполнение?). - person Wiktor Stribiżew; 12.04.2017