повторно захватить несколько групп, соответствующих одному шаблону python - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь захватить содержимое между метками времени из столбца данных.

Данные, представленные в столбце данных, состоят из метки времени, за которой следует текст, затем один или несколько символов новой строки, за которыми следует текст и так далее.

Моя цель - захватить весь текст в столбце, разделенный метками времени.

Мне удалось захватить первую группу текста с помощью поиска по шаблону ниже, но я хочу повторить то же самое илилучший способ захватить весь текст в столбце.

Моя цель - захватить выделенный текст на прикрепленном изображении.

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

pattern=re.compile(r'(^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})(\s[-].*\n)(\D*[.])')

Вывод: транзакции задания успешно выполнены через транзакции приложения.

Текст для поиска:

1997-09-01 12:30:14 - ABCD (Дополнительные комментарии) Транзакции задания успешно выполнены через транзакции приложения.1997-09-01 11:46:22 - EFGH (Дополнительные комментарии) Дело установлено.Команда для поддержки поддержки разрешения.1997-09-01 09:15:00 - ABC (Дополнительные комментарии) Подтверждено.Это не влияет на функциональность приложения.Это была единовременная работа.Нам нужно будет обсудить это с командой и проверить журналы, чтобы исследовать проблему.Это значение должно быть изменено на «низкую» серьезность, поскольку задание может быть перезапущено в любое время суток.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете использовать положительный взгляд назад и положительный взгляд вперед , чтобы проверить формат отметки времени:

[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}

Примечание , чтоформат не делает его действительной датой и / или временем.

(?<=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - ).*?(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - |$)

Другой вариант в python может заключаться в разделении на формат отметки времени:

import re
s = """1997-09-01 12:30:14 - ABCD (Additional comments) Job transactions done successfully through application transactions. 1997-09-01 11:46:22 - EFGH (Additional comments) Case set. Team to follow up with Support for resolution. 1997-09-01 09:15:00 - ABC (Additional comments) Acknowledged. This does not impact application functionality. It was a one off job executed . We will need to discuss this with Team and check the logs to investigate the issue. This should be changed to 'low' severity because the job can be re-run at any time of the day."""

print(filter(None, re.split(r'[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - ', s)))

Демо

0 голосов
/ 21 мая 2018

Хотя это можно сделать с помощью группы захвата, мне было бы проще сделать что-то вроде этого:

import re

sample="""1997-09-01 12:30:14 - ABCD
Job transactions done successfully through application transactions

1997-90-01 09:15:00 - ABC
Acknowledged

This does not impact functionality.
"""

def date_match(s):
    """Returns true if the beginning of this string matches a date and time."""
    return bool(re.match("\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}", s))

def yeild_matches(full_log):
    log = [] # keep track of this log
    for line in full_log.split("\n"): # for each line
        if date_match(line): # if this line starts with a date
            if len(log) > 0: # if theres already a log...
                # remove the first line (which included the date), and include this line of the log if its not an empty line
                lines = [l for l in log[1:] if l.strip()]
                yield "\n".join(lines) # yield the log
                log = [] # ... and set the log back to nothing.

        log.append(line) # add the current line to log (list)

    yield "\n".join([l for l in log[1:] if l.strip()]) # return the last log (theres no date at the end of the logs to end the last log)

logs = list(yeild_matches(sample))

for i, l in enumerate(logs, 1):
    print("Match {}:\n{}".format(i, l))

Вывод:

Match 1:
Job transactions done successfully through application transactions
Match 2:
Ackownledged
This does not impact functionality.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...