2016-11-10 448 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

对不起,我想我没有说清楚。还有一些其他消息,如“登录成功”,“RFC/CPIC登录成功”,所以我只显示我想清理的消息。 –

回答

2

尝试这样:

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

说明:(?<=...)是一个积极的回顾后,如该字符串必须与该组的内容匹配,但不会被捕获,因此不会被替换。在积极的预见(?=...)的另一边同样的事情。 \b是一个单词边界,所以这些单词之间的所有内容都将被匹配。由于这也将修剪掉空白,所以替换是单个空白。

+0

请参阅OP的评论,我认为这不够一般。 – sobek

+0

@sobek我读过评论,但我认为它已经足够普遍了:它只会删除报告作业,但在应用于每条消息时不会触及任何其他消息。 – Lucero

+0

非常感谢您的帮助和解释!这是我的案件的工作。但我想我仍然有些困惑:1。像什么^用于(?<=^Report \ b)?这是否表示模式匹配的初始位置?谢谢! –

1

我不知道的Python语法,但我可以肯定这个正则表达式可以帮助你满足你的字符串

/^报告\ w +([\ w &#@%^〜! - ] +)\ W +开始/ M *

蟒蛇字符串可能是这样的
文本= “报告ZSIM_RANDOM_DURATION_开始”;

clean_special2 =应用re.sub(R '^报告\ w +([\ w &#@%^〜! - ] +)\ W +开始',””,文本)*

1

这个应该是...'^ Report \ [^ \] * \ started'

正则表达式是黑魔法,只有当你必须使用它。在线工具使得它更容易编写:https://regex101.com/

+0

谢谢你的帮助,让我知道这个网站! –

+0

@zihanmeng重读这个我仍然不确定我是否正确理解你的问题。你提到的“其他信息”在哪里发生?在他们自己的路线?或者在同一个字符串内的某个地方?包含您需要保留的这些“其他消息”的示例会很有用。 – technicalbloke

+0

@technicalbloke Regex根本不是什么黑魔法......它是一个强大的工具,应该在适当的地方使用,也就是说,对于文本上的大多数不重要的模式匹配任务。 – Lucero

相关问题