Добавление элементов в список с помощью регулярных выражений для поиска правильного заголовка - PullRequest
0 голосов
/ 12 июня 2018

У меня есть список, который я изначально взял из файла CSV и сохранил в списке.Файл CSV изначально был листом Excel, в котором были категории с данными для каждого.У меня были проблемы с попыткой извлечь заголовок и контент вместе с ним организованным способом.список выглядит следующим образом

myLoad =[
['Unit 1000', '', '']
['A1', 'Food', 'Good']
['A3', 'Drink', 'Poor']
['A6', 'Food', '']
['Unit 1001',  '', '']
['A7', 'Cheese', 'Yellow']
['A8', 'Coke', 'Brown] ]

, и я бы хотел, чтобы список выглядел примерно так:

1000, A1, Food, Good
1000, A3, Drink, Poor
1000, A6, Food, 
1001, A7, Cheese, Yellow
1001, A8, Coke, Brown

Хотя был другой список, с которым я сравнивал его для извлечения данных, я былс помощью регулярных выражений, чтобы найти номер подразделения, но даже после того, как я смог найти номер, я не смог извлечь остальную часть списка с каждым номером категории, чтобы пойти с ним. То, что я до сих пор имел.

loadRegex = re.compile(r'\d{4}')

for i, row in enumerate(myLoad):
  thisLoad = loadRegex.search(row[0])
  if thisLoad:
    print thisLoad.group() #which would print each number

После этого я не мог понять, каким образом я мог заставить Unit # напечатать (и в конечном итоге добавить в новый список), и содержимое под ним для каждого раздела, как будто все это было вместе.

Я хотел, чтобы содержимое было таким, как если бы Unit # был найден, затем печатайте каждую строку до тех пор, пока не будет найден следующий # Unit #, но он должен быть основан на регулярном выражении, чтобы я мог использовать тот же регулярное выражение для сравнениятот же номер устройства в другой файл

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Вот еще один способ сделать это:

from pprint import pprint

myLoad =[
    ['Unit 1000', '', ''],
    ['A1', 'Food', 'Good'],
    ['A3', 'Drink', 'Poor'],
    ['A6', 'Food', ''],
    ['Unit 1001',  '', ''],
    ['A7', 'Cheese', 'Yellow'],
    ['A8', 'Coke', 'Brown']]

result = []
unit = None
for load in myLoad:
    if load[0].startswith('Unit'):
        _, unit = load[0].split()
    elif unit:
        result.append([unit] + load)

pprint(result)

Какие выходы:

[['1000', 'A1', 'Food', 'Good'],
 ['1000', 'A3', 'Drink', 'Poor'],
 ['1000', 'A6', 'Food', ''],
 ['1001', 'A7', 'Cheese', 'Yellow'],
 ['1001', 'A8', 'Coke', 'Brown']]
0 голосов
/ 12 июня 2018

Я не буду использовать regex здесь.

myLoad =[
    ['Unit 1000', '', ''],
    ['A1', 'Food', 'Good'],
    ['A3', 'Drink', 'Poor'],
    ['A6', 'Food', ''],
    ['Unit 1001',  '', ''],
    ['A7', 'Cheese', 'Yellow'],
    ['A8', 'Coke', 'Brown'] ]

lst = []
for x in myLoad:
    if x[0].startswith('Unit'):
        unit = x[0].split()[1]
        continue   
    lst.extend([[unit] + x])   # or lst.append([unit] + x)

print(lst)

# [['1000', 'A1', 'Food', 'Good'], 
#  ['1000', 'A3', 'Drink', 'Poor'], 
#  ['1000', 'A6', 'Food', ''], 
#  ['1001', 'A7', 'Cheese', 'Yellow'], 
#  ['1001', 'A8', 'Coke', 'Brown']]
0 голосов
/ 12 июня 2018

Если вы хотите решить эту проблему с помощью версии панд, вы можете попробовать это,

df= pd.DataFrame(myLoad)
df.loc[df[1]=='','new']=df[0].str.strip('Unit ')
df['new']=df['new'].fillna(method='ffill')
df=df[['new',0,1,2]]
df=df[df[1]!='']
print df.values

Вывод:

[['1000' 'A1' 'Food' 'Good']
 ['1000' 'A3' 'Drink' 'Poor']
 ['1000' 'A6' 'Food' '']
 ['1001' 'A7' 'Cheese' 'Yellow']
 ['1001' 'A8' 'Coke' 'Brown']]

Объяснение:

  1. Преобразуйте ваш список в DataFrame.

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

  3. извлечь необходимые строки.

0 голосов
/ 12 июня 2018

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

myLoad =[
['Unit 1000', '', ''],
['A1', 'Food', 'Good'],
['A3', 'Drink', 'Poor'],
['A6', 'Food', ''],
['Unit 1001',  '', ''],
['A7', 'Cheese', 'Yellow'],
['A8', 'Coke', 'Brown']]
unit = 0
for i in myLoad:
   if 'Unit' not in i[0]:
      print(', '.join([unit,i[0],i[1],i[2]]))
   else:
      unit = i[0].split()[-1]

Вывод:

1000, A1, Food, Good
1000, A3, Drink, Poor
1000, A6, Food, 
1001, A7, Cheese, Yellow
1001, A8, Coke, Brown
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...