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
}

私の実際の使用例は、最初の引数が file_object になることです。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 に答える