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

Python 如何替换为正则表达式命名的组?,python,regex,logparser,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.'

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

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
}
regex_str='^.*名称是(?P[^.]*)生命?在(?P[^.]*)中.$'
语句='我的名字叫巴拉。我住在孟买
陈述2='他的名字叫巴拉。他住在孟买
ret=find_行([statement,'Garbage'],regex_str,name='bala',place='chennai')
ret=={
“预期”:“我叫巴拉,住在钦奈。”
“实际”:我叫巴拉,住在孟买
“isMatched”:错误
}
ret=find_行([statement2,'Garbage'],regex_str,name='bala',place='chennai')
ret=={
“预期”:“他的名字叫巴拉,他住在钦奈。”
“他叫巴拉,住在孟买。”
“isMatched”:错误
}
ret=查找行(['Garbage1','Garbage2',regex_str,name='bala',place='chennai'))
ret=={
'应为':'^.*名称为(?P[^.]*).*生活在(?P[^.]*).$'
“实际的”:”
“isMatched”:错误
}
ret=find_line(['Garbage1',statement,'Garbage2',statement2],regex_str,name='bala',place='mumbai')
ret=={
“我的名字叫巴拉,我住在孟买。”
“实际”:我叫巴拉,住在孟买
“isMatched”:正确
}
我真正的用例是第一个参数将是一个file\u对象。find_line函数将一直跟踪文件,直到找到匹配项(正确或错误)或固定超时

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

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

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

我的简单尝试

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)。从示例中可以看出,“预期”是转换匹配字符串的结果。因此,如果没有字符串匹配,则无法形成预期值。

我的直接尝试

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)。从示例中可以看出,“预期”是转换匹配字符串的结果。所以,如果没有匹配字符串,就不能形成期望值。

在第一种情况下,如果
statement='他的名字是bala。他住在孟买。
那么
预期的
字段值应该是多少?@DairT'arg用预期值更新并更正其他值example@BrenBarn我还在想。。想不出一个好的解决办法。@balki还是没把你弄明白。除了命名的正则表达式参数之外,您想要正则表达式匹配吗?在第一种情况下,如果
statement='他的名字是bala。他住在孟买。
那么
预期的
字段值应该是多少?@DairT'arg用预期值更新并更正其他值example@BrenBarn我还在想。。想不出一个好的解决办法。@balki还是没把你弄明白。除了命名的正则表达式参数外,是否要正则表达式匹配?