Как извлечь подстроки из огромной строки в Python? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть огромные строки (7-10 тыс. Символов) из файлов журналов, из которых мне нужно автоматически извлекать и табулировать информацию.Каждая строка содержит около 40 значений, которые вводятся разными людьми.Пример;

Example string 1.) 'Color=Blue, [randomJunkdataExampleHere] Weight=345Kg, Age=34 Years, error#1 randomJunkdataExampleThere error#1'
Example string 2.) '[randomJunkdataExampleHere]   Color=Red 42, Weight=256 Lbs., Age=34yers, error#1, error#2'
Example string 3.) 'Color=Yellow 13,Weight=345lbs., Age=56  [randomJunkdataExampleHere]'

Желаемым результатом является новая строка или даже словарь, который организует данные и готовит данные для записи в базу данных (одна строка для каждой строки данных);

Color,Weight,Age,Error#1Count,Error#2Count
blue,345,34,2,0
red,256,24,1,1
yellow,345,56,0,0

Рассмотреноиспользуя re.search для каждого столбца / значения, но так как существует разница в том, как пользователи вводят данные, я не знаю, как отловить только числа, которые я хочу извлечь.Также не знаю, как зафиксировать, сколько раз в строке встречается сообщение «Ошибка # 1».

import re
line = '[randomJunkdataExampleHere] Color=Blue, Weight=345Kg, Age=34 Years, error#1, randomJunkdataExampleThere error#1'

try:    
    Weight = re.search('Weight=(.+?), Age',line).group(1)
except AttributeError:
    Weight = 'ERROR'

Цель / результат:

Color,Weight,Age,Error#1Count,Error#2Count
blue,345,34,2,0
red,256,24,1,1
yellow,345,56,0,0

1 Ответ

0 голосов
/ 17 мая 2019

Как указано выше, 10000 символов на самом деле не так уж и много.

import time

example_string_1 = 'Color=Blue, Weight=345Kg, Age=34 Years, error#1, error#1'
example_string_2 = 'Color=Red 42, Weight=256 Lbs., Age=34 yers, error#1, error#2'
example_string_3 = 'Color=Yellow 13, Weight=345lbs., Age=56'

def run():
examples = [example_string_1, example_string_2, example_string_3]
dict_list = []

for example in examples:
    # first, I would suggest tokenizing the string to identify individual data entries.
    tokens = example.split(', ')
    my_dict = {}
    for token in tokens: # Non-error case
        if '=' in token:
            subtokens = token.split('=') # this will split the token into two parts, i.e ['Color', 'Blue']
            my_dict[subtokens[0]] = subtokens[1]
        elif '#' in token: # error case. Not sure if this is actually the format. If not, you'll have to find something to key off of.
            if 'error' not in my_dict or my_dict['error'] is None:
                my_dict['error'] = [token]
            else:
                my_dict['error'].append(token)
    dict_list.append(my_dict)

# Now lets test out how fast it is.
before = time.time()

for i in range(100000): # run it a hundred thousand times
    run()

after = time.time()

print("Time: {0}".format(after - before))

Выход:

Time: 0.5782015323638916

Видите?Не так уж плохо.Теперь осталось только перебрать словарь и записать нужные метрики.

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