Я пытаюсь найти в теле письма определенные строки. Мне удалось получить извлечение всего тела письма. Теперь я хочу извлечь из него определенные строки. Мой код на данный момент:
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
Наверное, подойдет и regex = r'Event demon log entry:[\r\n]*\[[^]]+]\s*(.*?)\s*EVENT: ALARM'.
Если вы опубликуете свой пример входных данных, это будет полезно для просмотра вашего регулярного выражения.
только что опубликовал, спасибо
@ WiktorStribiżew, к сожалению, не работает: [(u'Event запись в журнале демона: \ r \ n \ r \ n [27.12.2018 03:10:06] CAUAJM_I_40245 EVENT: ALARM ', u'CAUAJM_I_40245') ]
См. regex101.com/r/sn1mGw/1. Если вы используете его с re.findall, вы должны получить только CAUAJM_I_40245. Если вы используете re.search, возьмите match.group(1).
Это не лучшее регулярное выражение в мире, но вроде работает нормально: (?: \ BEvent запись журнала демона:) (?: \ R? \ N | \ r) + (?: [[^]] +]) (. +) (? :: ТРЕВОГА. +)
Ах, вы обернули мое регулярное выражение в (...). Не делайте этого, уберите внешние скобки.






Вы можете использовать
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 - буквальная подстрока.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, я борюсь с генератором, который вы отправили, но не могу понять
К сожалению, ничего не получается :( Для 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
@xerks Понятия не имею, с вашим текущим вводом, это работает хорошо, он извлекает все данные.
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по-прежнему ничего, не могли бы вы просто привести мне пример, как получить имя задания: p2_creditriskreporter_generate_lnclose_cob?
@xerks Строка? Список? JOB:\s*(\S+)? regex101.com/r/sn1mGw/4?
Строка лучше, если невозможно, то список
Спасибо за вашу ценную помощь, теперь у меня все хорошо, счастливых праздников !!
Используйте
string_name.[string_name.find(']')+1:string_name.find('EVENT:')]