Получить подстроку из списка

Я пытаюсь найти в теле письма определенные строки. Мне удалось получить извлечение всего тела письма. Теперь я хочу извлечь из него определенные строки. Мой код на данный момент:

resp, items = conn.uid("search",None, 'All')
items = items[0].split()
for emailid in items:
    resp, data = conn.uid("fetch",emailid, "(RFC822)")
    if resp == 'OK':
        email_body = data[0][1].decode('utf-8')
        mail = email.message_from_string(email_body)
        if mail["Subject"].find("PA1") > 0 or mail["Subject"].find("PA2") > 0:

           regex = r"(\bEvent demon log entry:)(?:\r?\n|\r)+(\[[^]]+\].*)"
           a=re.findall(regex, email_body , re.IGNORECASE)

Теперь я получаю эти строки:

[(u'Event demon log entry:', u'[27/12/2018 05:29:30]      CAUAJM_I_40245 EVENT: ALARM            ALARM: JO=\r')]
[(u'Event demon log entry:', u'[27/12/2018 04:58:05] CAUAJM_I_40245 EVENT: ALARM ALARM: JOBFAILURE JOB: p2=\r')]
[(u'Event demon log entry:', u'[27/12/2018 06:00:03]      CAUAJM_I_40245 EVENT: ALARM            ALARM: JO=\r')]
[(u'Event demon log entry:', u'[27/12/2018 07:00:05]      CAUAJM_I_40245 EVENT: ALARM            ALARM: JO=\r')]

но хочу получить все между [(u'Event demon log entry:', u'[27/12/2018 05:29:30] и EVENT: ALARM ALARM: JO=\r')]

Желаемый результат:

CAUAJM_I_40245 EVENT

Исходный код из тела письма:

Event demon log entry:

[27/12/2018 04:48:17]      CAUAJM_I_40245 EVENT: ALARM            ALARM: JOBFAILURE       JOB: bx_p2_reporting EXITCODE:  1

Обновлено:

Оказалось, мне нужно получить следующее:

JOB: bx_p2_reporting EXITCODE:  1

от

Event demon log entry:

[26/12/2018 20:17:14] CAUAJM_I_40245 EVENT: ALARM ALARM: JOBFAILURE JOB: p2=
_batch_excel_RevalFutBasisSpdCalc_NY3pm MACHINE: ldnmdsbatchxl01 EXITCODE: =
268438455

Используйте string_name.[string_name.find(']')+1:string_name.find('EVENT‌​:')]

Mohit Motwani 27.12.2018 12:08

Наверное, подойдет и regex = r'Event demon log entry:[\r\n]*\[[^]]+]\s*(.*?)\s*EVENT: ALARM'.

Wiktor Stribiżew 27.12.2018 12:10

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

Benjamin Rowell 27.12.2018 12:12

только что опубликовал, спасибо

user10205566 27.12.2018 12:14

@ WiktorStribiżew, к сожалению, не работает: [(u'Event запись в журнале демона: \ r \ n \ r \ n [27.12.2018 03:10:06] CAUAJM_I_40245 EVENT: ALARM ', u'CAUAJM_I_40245') ]

user10205566 27.12.2018 12:29

См. regex101.com/r/sn1mGw/1. Если вы используете его с re.findall, вы должны получить только CAUAJM_I_40245. Если вы используете re.search, возьмите match.group(1).

Wiktor Stribiżew 27.12.2018 12:34

Это не лучшее регулярное выражение в мире, но вроде работает нормально: (?: \ BEvent запись журнала демона:) (?: \ R? \ N | \ r) + (?: [[^]] +]) (. +) (? :: ТРЕВОГА. +)

Benjamin Rowell 27.12.2018 12:35

Ах, вы обернули мое регулярное выражение в (...). Не делайте этого, уберите внешние скобки.

Wiktor Stribiżew 27.12.2018 12:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать

r'Event demon log entry:[\r\n]*\[[^]]+]\s*(.*?)\s*EVENT: ALARM'

См. демонстрация регулярного выражения

Если вы используете его с re.findall, вы должны получить только CAUAJM_I_40245.

Подробности

  • Event demon log entry: - буквальная подстрока
  • [\r\n]* - 0+ символов CR или LF
  • \[ - символ [
  • [^]]+ - 1 или более символов, кроме ]
  • ] - символ ]
  • \s* - 0+ пробелов
  • (.*?) - Группа 1: любые ноль или более символов, кроме символов разрыва строки, как можно меньше
  • \s* - 0+ пробелов
  • EVENT: ALARM - буквальная подстрока.

Демо Python:

import re
rx = r"Event demon log entry:[\r\n]*\[[^]]+]\s*(.*?)\s*EVENT: ALARM"
s = "Event demon log entry:\n\n[27/12/2018 04:48:17]      CAUAJM_I_40245 EVENT: ALARM            ALARM: JOBFAILURE       JOB: bx_p2_reporting EXITCODE:  1"
print(re.findall(rx, s, re.IGNORECASE))
# => ['CAUAJM_I_40245']

извините, Виктор, оказалось, что теперь мне нужно извлечь имя задания и код выхода: From Event demon log entry: [27/12/2018 04:48:17] CAUAJM_I_40245 EVENT: ALARM ALARM: JOBFAILURE JOB: bx_p2_reporting EXITCODE: 1, чтобы получить JOB: bx_p2_reporting EXITCODE: 1, я борюсь с генератором, который вы отправили, но не могу понять

user10205566 27.12.2018 13:31

К сожалению, ничего не получается :( Для regex = r"Event demon log entry:[\r\n]*\[[^]]+]\s*(.*?)\s*EVENT: ALARM.*?JOB:\s*(\S+)\s*EXITCODE:\s*(\d+)" a=re.findall(regex,email_body, re.IGNORECASE) print a нужен только JOB: bx_p2_reporting EXITCODE: 1

user10205566 27.12.2018 14:02

@xerks Понятия не имею, с вашим текущим вводом, это работает хорошо, он извлекает все данные.

Wiktor Stribiżew 27.12.2018 14:05
Event demon log entry: [27/12/2018 01:18:39] CAUAJM_I_40245 EVENT: ALARM ALARM: JOBFAILURE JOB: p2_creditriskreporter_generate_lnclose_cob MACHINE: p2prog06 EXITCODE: 1
user10205566 27.12.2018 14:50

по-прежнему ничего, не могли бы вы просто привести мне пример, как получить имя задания: p2_creditriskreporter_generate_lnclose_cob?

user10205566 27.12.2018 14:55

@xerks Строка? Список? JOB:\s*(\S+)? regex101.com/r/sn1mGw/4?

Wiktor Stribiżew 27.12.2018 14:57

Строка лучше, если невозможно, то список

user10205566 27.12.2018 14:58

Спасибо за вашу ценную помощь, теперь у меня все хорошо, счастливых праздников !!

user10205566 27.12.2018 15:06

Другие вопросы по теме