python 正则小试

danny posted @ 2014年9月27日 00:55 in python with tags python , 3108 阅读

有一段日志,需要提取括号中的一些值,组成新文件.

spawn runmqsc dcllf.mqm
display queue('q_*') curdepth
end
5724-H72 (C) Copyright IBM Corp. 1994, 2005.  ALL RIGHTS RESERVED.
启动队列管理器 dcllf.mqm 的 MQSC。


     1 : display queue('q_*') curdepth
AMQ8409: 显示队列细节。
   QUEUE(q_act_shell_act)                  TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_act_shell_control)              TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_act_shell_module)               TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mo_log)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mt_act_1)                   TYPE(QLOCAL)
   CURDEPTH(11)                         
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mt_act_2)                   TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mt_act_3)                   TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mt_batch_1)                 TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_mt_log)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mms_report)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_act)                         TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_old_mms)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_old_sms)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_route)                       TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_tp)                          TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mo_tp_provision)                TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_mt_tp_msgid)                    TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_performance_test)               TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_mo_log)                     TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_mt_act_1)                   TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_mt_act_2)                   TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_mt_act_3)                   TYPE(QLOCAL)
   CURDEPTH(0)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_mt_log)                     TYPE(QLOCAL)
   CURDEPTH(6)                          
AMQ8409: 显示队列细节。
   QUEUE(q_sms_report)                     TYPE(QLOCAL)
   CURDEPTH(51)                         
     2 : end
读取一个 MQSC 命令。
所有命令均无语法错误。
已处理所有的有效 MQSC 命令。

有人提供了这样一种办法

 

我觉得不优雅,应该有更好的办法,于是想到用正则. 主要涉及反向引用,非贪婪模式和多行匹配模式.

 

#!/usr/bin/env python3

import re
data = open('mqwatch.txt', 'r').read()
b = re.findall('QUEUE\((.*?)\).*?CURDEPTH\((\d+)\)', data, re.S)
x = ';'.join(['%s,%s' % (i[0], i[1]) for i in b])
print(x)

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter