我有一个解析日志中的行列表,如下所示:
parsedLog = ['20151005 09:11:14 LOG_ID 00000000', '20151005 09:11:14 LOG_ADDR 0173acc4\n Address of log', '20151005 09:11:14 READ_CONFIG 00000105',
我正在寻找最简单的方法从列表中的第二个元素中提取值0173acc4
,基于字符串LOG_ADDR
(即键)(原因是日志不会总是一致)。
我目前正在使用以下一个班轮:
filter(lambda line: 'LOG_ADDR' in line, parsedLog)[0].split('\n')[-8:]
答案 0 :(得分:5)
您可以使用正则表达式。
for line in parsedlog:
if 'LOG_ADDR' in line:
print re.search(r'\S+(?=\n)', line).group()
\S+
匹配一个或多个非空格字符。因此,只有当\S+(?=\n)
后跟换行字符时,此print
才匹配一个或多个非空格字符。前瞻是断言,它不会消耗任何单个字符,但断言是否可以匹配。
或
将print re.search(r'\bLOG_ADDR\s+(\S+)', line).group(1)
stmt更改为
>>> for line in parsedLog:
if 'LOG_ADDR' in line:
s = line.split()
for i,j in enumerate(s):
if j == 'LOG_ADDR':
print(s[i+1])
0173acc4
>>>
或
>>> for line in parsedLog:
if 'LOG_ADDR' in line:
s = line.split()
print s[s.index('LOG_ADDR')+1]
0173acc4
或
overlayProjection
答案 1 :(得分:1)
使用列表理解:
[i.split()[i.split().index("LOG_ADDR")+1] for i in parsedLog if "LOG_ADDR" in i][0]
'0173acc4'
或展开,更干净,更易读,更快,因为split()
未执行两次:
for i in parsedLog:
if "LOG_ADDR" in i:
line_split = i.split()
index_addr = line_split.index("LOG_ADDR") + 1
print line_split[index_addr]
它得到LOG_ADDR
之后的值,假设条件是常数。
line_split.index("LOG_ADDR") + 1
为您提供分割线中的索引,我们为此添加一个索引以获取下一个项目
答案 2 :(得分:1)
parsedLog = ['20151005 09:11:14 LOG_ID 00000000', '20151005 09:11:14 LOG_ADDR 0173acc4\n Address of log', '20151005 09:11:14 READ_CONFIG 00000105']
print(re.search(r'\bLOG_ADDR\W+(\w+)', ''.join(parsedLog), re.MULTILINE).groups(1)[0])
0173acc4