Проблема с некоторыми пропущенными значениями с повторным модулем - PullRequest
0 голосов
/ 02 ноября 2019

В настоящее время я работаю над функцией синтаксического анализа с использованием регулярных выражений, но написанная мной функция не может обрабатывать пропущенные данные. Код, который я использую, основан на коде https://www.vipinajayakumar.com/parsing-text-with-python/ и анализирует поля структурированного текста с каждой строкой в ​​виде:

someField = someValue

Эти файлы, которые я анализирую, по построению могут иметь некоторые поля, которые не имеют значения в someValue . Поскольку впоследствии я создаю строку, как в ссылке, как я могу обработать пропущенные значения, если файл, который я анализирую, не содержит никакого значения для определенного поля?

РЕДАКТИРОВАТЬ:

IПриведу пример. Скажем, TXT-файлы, которые мне нужно проанализировать, содержат эти два поля:

Высота = 176

Вес = 75,9

и с использованием только этой части кода:

import os
import re 
import pandas as pd



def parse_line(line, curr_dict):
    """
    The function parse_line(line) does a parse on the input line. This function is taken from the tutorial on parsing files available at https://www.vipinajayakumar.com/parsing-text-with-python/ 
    """
    for key, rx in curr_dict.items():
        match = rx.search(line)
        if match:
            return key, match
    # if there are no matches
    return None, None

test_dict={
    'Weight' : re.compile(r'Weight=(?P<Weight>\d+[.]\d+)\n'),
    'Height' : re.compile(r'Height=(?P<Height>\d+)\n'), 
}

with open(txt_file,'r') as f:
        new_line = f.readline()
        while new_line:
            key, match = parse_line(new_line, test_dict)
            if key :
                if key == 'Weight':
                    Weight = match.group('Weight')
                    Weight = float(Weight)
                if key == 'Height':
                    Height = match.group('Height')
            new_line = f.readline()
row = {'Height' : Height,
       'Weight' : Weight,
      }
df = pd.DataFrame(row, index=[1])

Если в файле заполнены все поля, как показано выше, проблем нет, но если, например:

Высота =

Вес = 75,9

У меня ошибка, потому что у меня отсутствует значение в Height =

1 Ответ

0 голосов
/ 02 ноября 2019

Предполагая, что someValue просто пусто, когда оно отсутствует, вам просто нужно добавить ? после групп, соответствующих полям someValue.

Случайный пример того, как это будет выглядетьиз предоставленных вами:

re.compile(r'Weight=(?P<Weight>\d+[.]\d+)?\n')

Обратите внимание на восклицательный знак перед символом новой строки.

Если на самом деле это пробел, а не просто пробел, попробуйте

re.compile(r'Weight=(?P<Weight>\d+[.]\d+)? ?\n')

Из документов :

?

Заставляет полученное RE совпадать с 0 или1 повторение предыдущего RE. ab? будет соответствовать 'a' или 'ab'.

Учитывая, что совпадение будет None, если значение не указано, вы также должны добавить проверку значения в свой код:

if key :
    if key == 'Weight':
        Weight = match.group('Weight')
        if Weight is not None:
            Weight = float(Weight)
        else:
            Weight = 0.0

    if key == 'Height':
        Height = match.group('Height')
        if Height is not None:
            Height = float(Height)
        else:
            Height = 0.0

...