我试图在基于正则表达式的日志文件中找到匹配的行,然后检查其中的组并报告预期和实际行。 以下示例显示了我正在尝试做什么。
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
实现。
有什么建议/解决方案吗?
答案 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)
获得它),使用各种方法处理匹配的组内容和位置。