2015-10-05 68 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 
相關問題