从文件中的行读取多个子字符串

时间:2016-04-14 03:38:23

标签: python file-io scripting

基本上我正在做的是使用python脚本从apache error_log文件生成报告。我正在处理的一个例子是:

[Wed Apr 13 18:33:42.521106 2016] [core:notice] [pid 11690] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Wed Apr 13 18:33:42.543989 2016] [suexec:notice] [pid 11690] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

我想要得到的最终结果如下:

core:notice - SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
suexec:notice - AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

这是错误类型,后跟尾随文本。然后我需要将这个格式化的文本写入一个新文件。

我一直在尝试使用正则表达式来执行此操作,但是我使用python已经有好几年了,之前从未使用过正则表达式。到目前为止我能够获得的最多是隔离第一个(日期)部分,但我无法弄清楚如何获得后续括号包围的子串和尾随文本。任何和所有的帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

由于您的数据恰好包含四个字段,除了最后一个字段外,每个字段显示的方括号都很好,您可以利用这些行为来执行任务,而无需使用Regex像这样:

texts = ['[Wed Apr 13 18:33:42.521106 2016] [core:notice] [pid 11690] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0', \
'[Wed Apr 13 18:33:42.543989 2016] [suexec:notice] [pid 11690] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)']
for text in texts:
    words = text.replace('[','').split(']')
    newWords = words[1] + ' -' + words[3]
    print(newWords)

导致:

 core:notice - SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
 suexec:notice - AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

这个想法是首先用空字符串替换一个起始方括号并使用结束方括号作为分割单词的参数(因此也将被删除):

words = text.replace('[','').split(']')

然后,您只需要组合要从中构建新string的字段:

newWords = words[1] + ' -' + words[3]

你已经完成了。