2015-10-05 66 views
4

我有一个解析的日志像这样的行的列表:干净的方法来从一个列表元素得到一个价值

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:] 

回答

5

您可以使用正则表达式。

​​

\S+匹配一个或多个非空格字符。所以这个\S+(?=\n)只会匹配一个或多个非空格字符,后面跟着一个换行符。 Lookaheads是不会消耗任何单个字符的断言,但断言是否可能匹配。

更改print语句来,

print re.search(r'\bLOG_ADDR\s+(\S+)', line).group(1) 

>>> 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 
+1

你也别后线'如果“LOG_ADDR”分裂:''然后line.index( 'LOG_ADDR')'而不是使用for循环。假设它是一致的 – SirParselot

+0

@SirParselot雅,这是一样的其他答案。但是我们需要在列表理解中避免更多的分割。 –

+0

啊,当我提到它时没有起来,但是是的,那正是我的想法。正则表达式是最好的方法 – SirParselot

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让你在分裂线的指标,这是我们增加一个获得下一个项目

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 
相关问题