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还是没把你弄明白。除了命名的正则表达式参数外,是否要正则表达式匹配?