2016-11-10 3 views
1

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

Мое сообщение выглядеть следующим образом:

Report ZSIM_RANDOM_DURATION_ started 
Report ZSIM_SYSTEM_ACTIVITY started 
Report /BDL/TASK_SCHEDULER started 
Report ZSIM_JOB_CREATE started 
Report RSBTCRTE started 
Report SAPMSSY started 
Report RSRZLLG_ACTUAL started 
Report RSRZLLG started 
Report RGWMON_SEND_NILIST started 

Я пытаюсь некоторый код:

clean_special2=re.sub(r'^[Report] [^1-9] [started]','',text) 

, но я думаю, что этот код будет удалить все строки, но я хочу, чтобы сохранить формат как отчет .. ...Начал. Поэтому я хочу только удалить имя задания посередине.

Я ожидаю, что мой результат выглядит следующим образом:

Report started 

Любой человек может помочь мне с идеей? Большое спасибо!

+0

Я не уверен, что понимаю. Как вы это описываете, не могли бы вы просто написать новый файл с таким же количеством строк, каждый из которых содержит «Отчет начался»? Вы не сделали ни одного случая, почему вам нужно регулярное выражение. – sobek

+0

Извините, я думаю, что не прояснил ситуацию. Также есть некоторые другие сообщения, такие как «Logon successful», «RFC/CPIC logon successful», поэтому я показываю сообщение, которое хочу очистить. –

ответ

2

попробовать что-то вроде этого:

clean_special2=re.sub(r'(?<=^Report\b).*(?=\bstarted)',' ',text) 

Объяснение: (?<=...) является положительным просмотром назад, например, строка должна соответствовать содержимому этой группы, но она не будет захвачена и, таким образом, не будет заменена. То же самое с другой стороны с положительным взглядом вперед (?=...). \b - это граница слова, так что все между этими словами будет согласовано. Так как это будет также обрезать пробелы, замена будет одним пробелом.

+0

См. Комментарий от OP, я думаю, что этого недостаточно общего. – sobek

+0

@sobek Я прочитал комментарий, но я думаю, что он достаточно общий: он удалит только задания отчета, но не коснется каких-либо других сообщений при применении к каждому сообщению. – Lucero

+0

Большое спасибо за помощь и объяснение! Это работа для моего дела. Но я думаю, что у меня все еще есть путаница: 1. как то, что использовать для (? <=^Report \ b)? Означает ли это указание начальной позиции для сопоставления шаблонов? Спасибо! –

1

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

/^ Report \ W + ([\ ш & # @%^~.! - ] +) \ W + начало/м *

строка питон может быть, как это
текст = "начал отчет ZSIM_RANDOM_DURATION_";

clean_special2 = re.sub (г '^ Report \ W + ([\ ш & # @%^~ -.] +) \ W + начало',»», текст) *

1

Это должно быть сделано ... '^ Отчет \ [^ \] * \ начал'

Регулярное черное волшебство, используйте его только тогда, когда вам нужно. Онлайн-инструменты значительно облегчают запись: https://regex101.com/

+0

Спасибо за помощь и дайте мне знать этот сайт! –

+0

@zihanmeng Перечитав это, я все еще не уверен, что правильно понимаю ваш вопрос. Где упоминаются «другие сообщения»? По их собственным линиям? или где-то внутри одной строки? Пример, который включает в себя эти «другие сообщения», которые вам нужно сохранить, был бы полезен. – technicalbloke

+0

@technicalbloke Regex совсем не черная магия ... это мощный инструмент, который следует использовать, когда это необходимо, то есть для большинства нетривиальных задач сопоставления шаблонов в тексте. – Lucero

Смежные вопросы