在一行中查找图案并在括号中打印以下值

时间:2017-02-24 18:09:53

标签: python

我正在尝试从文件中提取一些信息。该文件有许多行,如下面的

"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10] ......     

我想在每行搜索名称和castime,如果找到我想在括号中打印该值 括号中的值在不同的行中发生变化。例如,在上面的行名称中是DNSCR,而casttime是2,3,6,8。但长度可能会 在下一行有所不同

我尝试过以下代码,但它总是会给我10个字符,但我只需要支架中的任何内容。

c_req = 10 
keyword = ['"names":','"castime":']

with open('mylogfile.log') as searchfile:
    for line in searchfile:
        for key in keywords:
            left,sep,right = line.partition(key)

            if sep: 

                    print key + " = " + (right[:c_req])

3 个答案:

答案 0 :(得分:0)

这看起来就像json,每条线周围都有括号吗? 如果是这样,整个内容很容易解析:

import json
test = '{"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]}'
result = json.loads(test)   
print(result["names"], result["castime"])

如果匹配整个JSON文件,您还可以使用像pandas这样的库将整个文件读入数据框。

答案 1 :(得分:0)

使用正则表达式:

import re

# should contain all lines
lines = ['"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]']

# more efficient in large files
names_pattern = re.compile('"names":\["(\w+)"\]')
castime_pattern = re.compile('"castime":\[(.+)\],?')

names, castimes = list(), list()

for line in lines:
    names.append(re.search(names_pattern, line).group(1))
    castimes.append(
        [int(num) for num in re.search(castime_pattern, line).group(1).split(',')]
    )

添加异常处理和文件打开/阅读

答案 2 :(得分:0)

鉴于mylogfile.log

"names":["DNSCR"],"actual_names":["RADIO_R"],"castime":[2,4,6,8,10]
"names":["FOO", "BAR"],"actual_names":["RADIO_R"],"castime":[1, 2, 3]

使用正则表达式和here

import ast
import re

keywords = ['"names":', '"castime":']
keywords_name = ['names', 'castime']

d = {}

with open('mylogfile.log') as searchfile:
    for i, line in enumerate(searchfile):
        d['line ' + str(i)] = {}
        for key, key_name in zip(keywords, keywords_name):
            d['line ' + str(i)][key_name] = ast.literal_eval(re.search(key + '\[(.*?)\]', line).group(1))
print(d)

#{   'line 0': {'castime': (2, 4, 6, 8, 10), 'names': 'DNSCR'},
#    'line 1': {'castime': (1, 2, 3), 'names': ('FOO', 'BAR')}}

re.search(key + '\[(.*?)\]', line).group(1)会在[]之后抓住keys之间的所有内容。

ast.literal_eval()将转换删除string中无用的引号和空格,并在需要时自动创建tuples

我还使用enumerate来跟踪它在日志文件中的哪些行。