繁体   English   中英

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

[英]How to substitute into regex named groups?

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

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实现。 有什么建议/解决方案吗?

我直截了当的尝试

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)。 从示例中可以看到,“ Expected”是转换数学字符串的结果。 因此,如果未对任何字符串进行数学运算,则无法形成期望值。

我建议您仔细阅读re模块文档 特别是,存在re.MatchObject (作为re.match(regex_str, statement)的结果可以获取),它具有用于处理匹配组内容和位置的各种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM