簡體   English   中英

從list元素中獲取值的最簡潔方法

[英]Cleanest way to get a value from a list element

我有一個解析日志中的行列表,如下所示:

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

你可以使用正則表達式。

for line in parsedlog:
    if 'LOG_ADDR' in line:
        print re.search(r'\S+(?=\n)', line).group()

\\S+匹配一個或多個非空格字符。 所以這個\\S+(?=\\n)只有在后面跟一個換行符時才匹配一個或多個非空格字符。 前瞻是斷言,它不會消耗任何單個字符,但會斷言匹配是否可行。

要么

print stmt更改為,

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

使用列表理解:

[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為您提供分割線中的索引,我們在其中添加一個索引以獲取下一個項目

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM