使用正则表达式将项添加到列表中以搜索正确的标题

时间:2018-06-12 04:47:51

标签: python regex python-2.7

我有一个列表,我最初从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#然后打印每一行直到找到下一个单位#,但它必须基于正则表达式,以便我可以使用相同的正则表达式来比较相同的单位编号到另一个文件

4 个答案:

答案 0 :(得分:0)

您不需要正则表达式,只需执行以下代码:

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

答案 1 :(得分:0)

我不会在这里使用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']]

答案 2 :(得分:0)

如果你想通过pandas版本解决这个问题, 你可以试试这个,

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. 提取所需的行。

答案 3 :(得分:0)

以下是另一种方式:

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']]