如何用正则匹配出每一条记录后面的字符串?

我不明白 发布于 2017/03/10 10:50
阅读 271
收藏 1

实际的案例请看下面我想在通过正则语句匹配出每一条信息的最后部分

$DEBUG 2014-06-24 17:17:34.555@00000000@0000@[InitUITicketSinglePriceInfo][562]目地车站: [ 0112 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][609]TPU获取单价结果, [ 0 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][610]TPU获取单价为 [ 2.00 元] 票价
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[InitUITicketSinglePriceInfo][568]最终单价为 [ 2.00 元] 票价

目地车站: [ 0112 ]
获取票价结果: iRet = 0
TPU获取单价结果, [ 0 ]
TPU获取单价为 [ 2.00 元] 票价
最终单价为 [ 2.00 元] 票价

最后一段字符串前面都是[XXX]或[XXXX]这样的字符串,当然 这个X是0-9的数字,每一行结束都有一个换行符,请各位帮帮我看看这个正则要怎么写呢?

加载中
0
Lin_R
Lin_R

引用来自“我不明白”的评论

引用来自“Lin_R”的评论

我用的是findall, 你可以试下

#coding=utf-8
import re
import os
testlog_Regex=re.compile(r'\[\d+\](.*$)')
for line in open("testlog.log",'r',encoding= 'UTF-8'):
    # 没有py3实验 所以直接手动改下, 如果有报错再说下, 不过正则那边应该是可以的
    print(re.findall(testlog_Regex, line)[0])

 

用findall的话就会有一个问题,让日志文件中有这样的行数的时候就有问题

$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][282] *************************************************
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][283] ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][284] *************************************************
$DEBUG 2014-06-24 14:25:52.190@
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*                 TvmTicket Startup            		        *
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@
$ INFO 2014-06-24 14:25:52.197@00000000@0000@[../main.cpp]版本 20130126: 增加判断更新钱票箱数据 。

当@字符后面无任务内容的时候这个就会报错。

我的代码如下:

testlog_Regex = re.compile(r'\[\d+\](.*$)')
    testlog_text = testlog_Regex.findall(line)
    if testlog_text == None:
        continue
    else:
        log_text = testlog_text
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

输出的结果是:

日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
日期:2014-06-24 时间:14:25:52.181 日志: ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
Traceback (most recent call last):
  File "C:/Python/untitled1/logread.py", line 26, in <module>
    log_text = testlog_text
IndexError: list index out of range


 

# if 那段换成下面的, 不需要判断None, 哪怕匹配不上, 返回的是'', 也不是None, 直接判断有内容的时候吧
  if testlog_text:
        log_text = testlog_text
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

# 另外, 针对那个索引异常, 估计是匹配不上但是你却取值的关系, 自己加个try来捕获跳过下吧

 

0
zheng_pat
zheng_pat
  String msg = "$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0";

        String regEx = "\\[[0-9]{1,}\\](.*)";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(msg);
        while(matcher.find())
            System.out.println(matcher.group(1));

 

zheng_pat
zheng_pat
group 用法 参考:http://www.cnblogs.com/jiafuwei/p/6080984.html
0
我不明白
我不明白

引用来自“zheng_pat”的评论

  String msg = "$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0";

        String regEx = "\\[[0-9]{1,}\\](.*)";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(msg);
        while(matcher.find())
            System.out.println(matcher.group(1));

 

您的这个 应该不是python语言吧 好像是 C++ 不过我觉得 你的这个给我提示挺多 我测试一下看看

0
我不明白
我不明白

引用来自“zheng_pat”的评论

  String msg = "$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0";

        String regEx = "\\[[0-9]{1,}\\](.*)";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(msg);
        while(matcher.find())
            System.out.println(matcher.group(1));

 

readtext = '$ INFO 2014-06-24 17:17:34.681@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][4335]数据库查询钱票箱状态 成功!'
textRegex=re.compile("\\[[0-9]{1,}\\](.*)")
text=textRegex.search(readtext)
print(text.group())

这是我跟您提示的正则表达式来做的效果可以 但是 输出的结果是这样的:

[4335]数据库查询钱票箱状态 成功!

有没有什么办法能直接通过正则去掉 这个 [4335]直接匹配到 “数据库查询钱票箱状态 成功!” 这样的效果?

请能否再指点一二。因为如果我得到的是“[4335]数据库查询钱票箱状态 成功!”这样的或者是“[1030]Attention: check refund condition: coin[ NO ] has refund[ NO ] refund sum[ 0 ]是否大于0[ NO ]”或者“[3880][ 交易类型 ]:[ 1 ]。”的数据以后需要做二次处理,1是考虑效果2是考虑还有一些特殊情况。举例说明一下,因为还有一些日志内容是类似这样的,请注意看后面的细节。

$ INFO 2014-06-24 17:17:31.238@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][3889][ 交易结束 ]消息结果:[ 成功 ]。
$ INFO 2014-06-24 17:17:31.237@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][3880][ 交易类型 ]:[ 1 ]。
$ INFO 2014-06-24 17:17:31.214@00000000@0000@[../ticketBusiness/cashTicketBusiness/CashTicketBusinessProc.cpp][310]refund cash result:[ OK ][ 0 ][ 0 ][ 0 ]
$ INFO 2014-06-24 17:17:31.213@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][1030]Attention: check refund condition: coin[ NO ] has refund[ NO ] refund sum[ 0 ]是否大于0[ NO ] 

类似这样的内容我不好做字符串分割。

0
Lin_R
Lin_R

 

cat 2.txt
$DUG 2014-06-24 17:17:34.555@00000000@0000@[InitUITicketSinglePriceInfo][562]目地车站: [ 0112 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][609]TPU获取单价结果, [ 0 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][610]TPU获取单价为 [ 2.00 元] 票价
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[InitUITicketSinglePriceInfo][568]最终单价为 [ 2.00 元] 票价EB
with open('2.txt') as f:
    for i in f:
        for i in re.findall(r'\[\d+\](.*$)', i):
            print i

 

0
我不明白
我不明白

引用来自“Lin_R”的评论

 

cat 2.txt
$DUG 2014-06-24 17:17:34.555@00000000@0000@[InitUITicketSinglePriceInfo][562]目地车站: [ 0112 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][609]TPU获取单价结果, [ 0 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][610]TPU获取单价为 [ 2.00 元] 票价
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[InitUITicketSinglePriceInfo][568]最终单价为 [ 2.00 元] 票价EB
with open('2.txt') as f:
    for i in f:
        for i in re.findall(r'\[\d+\](.*$)', i):
            print i

 

您的应该是python2.7

我现在用的是python3.5,我简单做了一个修改,添加了几条特殊情况下的日志记录

日志文件的名字是testlog.log

$DEBUG 2014-06-24 17:17:34.555@00000000@0000@[InitUITicketSinglePriceInfo][562]目地车站: [ 0112 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@CTpuApp.GetTpuTicketPrice()-[1379]获取票价结果: iRet = 0
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][609]TPU获取单价结果, [ 0 ]
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[GetTicketSinglePrice][610]TPU获取单价为 [ 2.00 元] 票价
$DEBUG 2014-06-24 17:17:34.565@00000000@0000@[InitUITicketSinglePriceInfo][568]最终单价为 [ 2.00 元] 票价
$ INFO 2014-06-24 17:17:34.681@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][4335]数据库查询钱票箱状态 成功!
$ INFO 2014-06-24 17:17:31.213@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][1030]Attention: check refund condition: coin[ NO ] has refund[ NO ] refund sum[ 0 ]是否大于0[ NO ]
$ INFO 2014-06-24 17:17:31.238@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][3889]send[ 交易结束 ]消息结果:[ 成功 ]。
$ INFO 2014-06-24 17:17:31.237@00000000@0000@[../ticketBusiness/businessInterfaceBase/BusinessInterfaceBase.cpp][3880][ 交易类型 ]:[ 1 ]。

以下是我修改的代码

import re
import os
#coding=utf-8
for line in open("testlog.log",'r',encoding= 'UTF-8'):
    testlog_Regex=re.compile(r'\[\d+\](.*$)')
    testlog_text=testlog_Regex.search(line)
    print(testlog_text.group())

输出的结果如下:

[562]目地车站: [ 0112 ]
[1379]获取票价结果: iRet = 0
[609]TPU获取单价结果, [ 0 ]
[610]TPU获取单价为 [ 2.00 元] 票价
[568]最终单价为 [ 2.00 元] 票价
[4335]数据库查询钱票箱状态 成功!
[1030]Attention: check refund condition: coin[ NO ] has refund[ NO ] refund sum[ 0 ]是否大于0[ NO ]
[3889]send送[ 交易结束 ]消息结果:[ 成功 ]。
[3880][ 交易类型 ]:[ 1 ]。

有什么办法能去掉结果每一行前面的[562]、[1379]、[609]、[610]、[568]、[4335]、[1030]、[3889]、[3880]呢?

通过正则语句匹配的方法好像挺困难,因为有一些日志记录比较特殊。

0
Lin_R
Lin_R

我用的是findall, 你可以试下

#coding=utf-8
import re
import os
testlog_Regex=re.compile(r'\[\d+\](.*$)')
for line in open("testlog.log",'r',encoding= 'UTF-8'):
    # 没有py3实验 所以直接手动改下, 如果有报错再说下, 不过正则那边应该是可以的
    print(re.findall(testlog_Regex, line)[0])

 

0
我不明白
我不明白

引用来自“Lin_R”的评论

我用的是findall, 你可以试下

#coding=utf-8
import re
import os
testlog_Regex=re.compile(r'\[\d+\](.*$)')
for line in open("testlog.log",'r',encoding= 'UTF-8'):
    # 没有py3实验 所以直接手动改下, 如果有报错再说下, 不过正则那边应该是可以的
    print(re.findall(testlog_Regex, line)[0])

 

用findall的话就会有一个问题,让日志文件中有这样的行数的时候就有问题

$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][282] *************************************************
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][283] ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][284] *************************************************
$DEBUG 2014-06-24 14:25:52.190@
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*                 TvmTicket Startup            		        *
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@
$ INFO 2014-06-24 14:25:52.197@00000000@0000@[../main.cpp]版本 20130126: 增加判断更新钱票箱数据 。

当@字符后面无任务内容的时候这个就会报错。

我的代码如下:

testlog_Regex = re.compile(r'\[\d+\](.*$)')
    testlog_text = testlog_Regex.findall(line)
    if testlog_text == None:
        continue
    else:
        log_text = testlog_text
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

输出的结果是:

日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
日期:2014-06-24 时间:14:25:52.181 日志: ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
Traceback (most recent call last):
  File "C:/Python/untitled1/logread.py", line 26, in <module>
    log_text = testlog_text
IndexError: list index out of range


 

0
我不明白
我不明白

引用来自“我不明白”的评论

引用来自“Lin_R”的评论

我用的是findall, 你可以试下

#coding=utf-8
import re
import os
testlog_Regex=re.compile(r'\[\d+\](.*$)')
for line in open("testlog.log",'r',encoding= 'UTF-8'):
    # 没有py3实验 所以直接手动改下, 如果有报错再说下, 不过正则那边应该是可以的
    print(re.findall(testlog_Regex, line)[0])

 

用findall的话就会有一个问题,让日志文件中有这样的行数的时候就有问题

$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][282] *************************************************
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][283] ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
$DEBUG 2014-06-24 14:25:52.181@00000000@0000@[../main.cpp][284] *************************************************
$DEBUG 2014-06-24 14:25:52.190@
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.190@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*                 TvmTicket Startup            		        *
$DEBUG 2014-06-24 14:25:52.191@*                                                           *
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@*************************************************************
$DEBUG 2014-06-24 14:25:52.191@
$ INFO 2014-06-24 14:25:52.197@00000000@0000@[../main.cpp]版本 20130126: 增加判断更新钱票箱数据 。

当@字符后面无任务内容的时候这个就会报错。

我的代码如下:

testlog_Regex = re.compile(r'\[\d+\](.*$)')
    testlog_text = testlog_Regex.findall(line)
    if testlog_text == None:
        continue
    else:
        log_text = testlog_text
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

输出的结果是:

日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
日期:2014-06-24 时间:14:25:52.181 日志: ******* Compile DateTime:[Nov 13 2013 10:05:41], 版本:****
日期:2014-06-24 时间:14:25:52.181 日志: *************************************************
Traceback (most recent call last):
  File "C:/Python/untitled1/logread.py", line 26, in <module>
    log_text = testlog_text
IndexError: list index out of range


 

引用来自“Lin_R”的评论

# if 那段换成下面的, 不需要判断None, 哪怕匹配不上, 返回的是'', 也不是None, 直接判断有内容的时候吧
  if testlog_text:
        log_text = testlog_text
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

# 另外, 针对那个索引异常, 估计是匹配不上但是你却取值的关系, 自己加个try来捕获跳过下吧

 

我刚才想了一下既然findall 返回的是列表,列表中如果没有任何内容那也就是空的,可以用len来做一个检测 如果==0 那么 就 说明 没有任何内容直接continue了 跳出 这个循环。

testlog_Regex = re.compile(r'\[\d+\](.*$)')
    testlog_text = testlog_Regex.findall(line)
    if len(testlog_text) == 0:
        continue
    else:
        log_text = testlog_text0
        print('日期:' + str(log_date) + ' 时间:' + str(log_time) + ' 日志:' + str(log_text))

这样就可以了,我测试结果一切正常,但是话说回来 日志文件中 可能会有各种我们预想不到的情况,只能是走一步看一步了,谢谢你给我提供这段代码和正则。

Lin_R
Lin_R
可能是别的语言造成的思维惯性, 在py里面, 空列表就是假, 不需要额外证明它是假
返回顶部
顶部