Нужна помощь, чтобы написать правильный вариант разбора - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно проанализировать текстовый файл, который выглядит следующим образом:

key : 123             
anotherKey : qwer                

oneMoreKey :         
somestring,        
somestring             

Есть много строк этого типа, они генерируются сервером автоматически, поэтому я не знаю, сколько из нихполучит синтаксический анализатор

Я решил разобрать foo: bar следующим образом:

def main():
    data = {}
    file = open('file.txt')  # opening log file
    for line in file:
        if re.match(r'^\s*$', line):
            pass
        else:
            line = line.split(':')

        key = line[0].strip() 
        if len(line) == 2: # this is a workaround for lines like "foo :\n
            value = line[1].strip()
        else:
            value = 'none'

        if key in data:
            pass
        else:
            data[key] = value 

Мне нужно получить все данные в формате json, например

{
    key : 123,
    anotherKey : qwer,
    oneMoreKey : [somestring, somestring]
}

1 Ответ

0 голосов
/ 10 февраля 2019

STH.как это?

import re

rx = re.compile(r'^(?P<key>\w+)\s:(?P<value>.+?)(?=^\w+\s*:|\Z)', re.S | re.M)

junk = """key : 123             
anotherKey : qwer                
foo : bar, zxc
oneMoreKey :         
somestring,        
somestring         


"""


def match(m):
    values = [val for value in re.split(r', *[\n\r]+', m) for val in [value.strip()] if val]
    return values if len(values) > 1 else m.strip()

d = {m.group('key'): match(m.group('value')) for m in rx.finditer(junk)}
print(d)

Это дает

{'key': '123', 'anotherKey': 'qwer', 'foo': 'bar, zxc', 'oneMoreKey': ['somestring', 'somestring']}

См. демо на regex101.com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...