如何替换为正则表达式命名组?

时间:2012-08-08 19:49:09

标签: python regex logparser

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

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
}

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

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

2 个答案:

答案 0 :(得分: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)。正如我们从示例中看到的那样,“预期”是转换字符串的结果。因此,如果没有匹配字符串,则不会形成预期值。

答案 1 :(得分:0)

我建议你仔细看看re module documentation。特别是,re.MatchObject(您可以通过re.match(regex_str, statement)获得它),使用各种方法处理匹配的组内容和位置。