1

我试图在基于 regex 的日志文件中找到匹配的行,然后检查其中的组并报告预期的和实际的行。以下示例显示了我正在尝试做的事情。

regex_str = '^.*name is (?P<name>[^.]*).*lives? in (?P<place>[^.]*).*$'
statement = 'My name is bala. I live in mumbai.'
statement2 = 'His name is bala. He lives in mumbai.'
ret = find_line([statement,'Garbage'],regex_str,name='bala',place='chennai')

ret == { 
'Expected' : 'My name is bala. I live in chennai.'
'Actual'   : 'My name is bala. I live in mumbai.'
'isMatched': False
}

ret = find_line([statement2,'Garbage'],regex_str,name='bala',place='chennai')

ret == { 
'Expected' : 'His name is bala. He lives in chennai.'
'Actual'   : 'His name is bala. He lives in mumbai.'
'isMatched': False
}

ret = find_line(['Garbage1','Garbage2'],regex_str,name='bala',place='chennai')

ret == {
'Expected' : '^.*name is (?P<name>[^.]*).*lives? in (?P<place>[^.]*).*$'
'Actual'   : '<No matching line>'
'isMatched': False
}

ret = find_line(['Garbage1',statement,'Garbage2',statement2],regex_str,name='bala',place='mumbai')

ret == {
'Expected' : 'My name is bala. I live in mumbai.'
'Actual'   : 'My name is bala. I live in mumbai.'
'isMatched': True
}

我真正的用例是第一个参数将是一个文件对象。find_line 函数将继续跟踪文件,直到找到匹配项(正确或错误)或固定超时。

我正在寻找一种find_line能够提供所需输出的实现。有什么建议/解决方案吗?

4

2 回答 2

1

我的直截了当的尝试

import re
def find_line(lines,regex_str,**params):
    regex = re.compile(regex_str)
    for line in lines:
        m = regex.match(line)
        if m:
            actual = m.string
            groups = sorted (
                [(0,0,'')] +
                [(m.start(gname),m.end(gname),gname) for gname in params] +
                [(len(actual),0,'')])
            expected = ''
            for i in range(len(groups)-1):
                expected += actual[groups[i][1]:groups[i+1][0]]
                gname = groups[i+1][2]
                if gname: expected += params[gname]
            return {'Expected': expected, 'Actual': actual, 'isMatched' : expected == actual}
    return {'Expected': None, 'Actual': None, 'isMatched' : False}

在未找到匹配的情况下出现问题(示例 3)。正如我们从示例中看到的那样,“预期”是转换数学字符串的结果。因此,如果没有计算任何字符串,则无法形成预期值。

于 2012-08-08T20:41:49.253 回答
0

我建议您仔细查看re 模块文档。特别是,有re.MatchObject(您可以通过 获得它re.match(regex_str, statement)),它具有用于处理匹配组内容和位置的各种方法。

于 2012-08-08T20:28:49.140 回答