【问题标题】:Adding items to a list using regex to search for the correct header使用正则表达式将项目添加到列表中以搜索正确的标题
【发布时间】:2018-06-12 04:47:51
【问题描述】:

我有一个最初从 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 #,但它必须基于正则表达式,以便我可以使用相同的正则表达式来比较相同的单元编号到另一个文件

【问题讨论】:

  • 我建议你使用字典

标签: python regex python-2.7


【解决方案1】:

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

    如果你想通过 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】:

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

      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
      

      【讨论】:

      • 这不是一个想要的答案。请看第一栏。 1001 应该在最后两行。
      【解决方案4】:

      这是另一种方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-02
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多