从列表元素中获取值的最干净的方法

2024-09-30 03:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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',

我正在寻找一种最干净的方法,根据字符串LOG_ADDR(即key)从列表中的第二个元素中提取值0173acc4(原因是日志并不总是一致的)。你知道吗

我目前正在使用以下一行:

filter(lambda line: 'LOG_ADDR' in line, parsedLog)[0].split('\n')[-8:]

Tags: of方法key字符串logidconfig元素
3条回答

你可以用正则表达式。你知道吗

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

\S+匹配一个或多个非空格字符。所以这个\S+(?=\n)只有在后跟换行符时才会匹配一个或多个非空格字符。Lookaheads是一种断言,它不使用任何单个字符,而是断言匹配是否可能。你知道吗

或者

printstmt改为

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

相关问题 更多 >

    热门问题