从关键字之间的列表中提取特定数据块

时间:2017-10-21 21:35:47

标签: python

我试图在关键词之间提取列表的特定部分,即在和之间的所有内容,并忽略其他所有内容。

['badsffsg\n', 'fssdfsdgdg\n''<begin data>\n', 'data\n', '<end data>\n', 'bagsdg\n', 'fsdgdg\n', '<begin data>\n', 'data\n', 'data\n', '<end data>\n' 'gsdg\n']

我无法弄清楚如何迭代列表。我解决了类似的问题,但是当字典中的固定索引只有一个数据块时。

def extract_person(lines, start_index=0):

    start = start_index
    end = lines.index('<end data>\n', start_index + 1)   
    mylist = []

    for line in range(start + 1, end):

这次是一个列表,有多个数据块,不确定数据的起始位置。它只是如何迭代这个我需要一些建议。

3 个答案:

答案 0 :(得分:0)

如果您当前位于数据块内,请使用变量作为标志。最初将标志设置为False

迭代列表,遇到块启动时,将标志设置为True。 如果flag为True且列表项既不是开始也不是结束标记进程列表项作为当前数据块的一部分。遇到块结束时,将标志设置为False,并可能对已关闭的数据块进行最终处理。

答案 1 :(得分:0)

使用列表的索引方法为您带来好处。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAny">
          <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

此输出

some_data = ['a', 2, 'b', 'start', 1, 2, 3, 'end']

start = some_data.index('start')+1
end = some_data.index('end')

for data in some_data[start:end]:
    print(data)

您可以在缺少标记的情况下添加条件测试

答案 2 :(得分:0)

好的,有一些不同的方法可以为此编写解决方案。让我们忘记索引的使用(因为在找不到标记时需要捕获异常;我假设你想要一个没有它的简单算法)。如果你仔细阅读这两个描述,下面的代码实际上是迈克尔提出的变体:

data = ['a', 2, 'b',
        'start', 1, 2, 3, 'end',
        'c', 'd',
        'start', 2, 2, 5, 'end',
        10,
        'start', 5, 6 ,7, 'end']

blocks = [] # to keep valid data blocks
pos = 0
end = len(data)
while pos < end:
    if data[pos] == 'start':
        block = []
        pos += 1
        while pos < end and data[pos] != 'end': # condition order important!
            block.append(data[pos])
            pos += 1
        blocks.append(block)
    else:
        pos += 1

print(blocks)

说明:

我们将收集变量blocks中的有效数据块。

我们使用end(位置)从头开始查看pos(而不是更多)以保持当前索引位置。找到'start'表示创建一个空的新block来存储下一个项目,直到我们找到'end'标记。

我们附加了块数据,但要注意列表不会过早结束,直到我们找到'end'标记。条件顺序很重要,否则我们可能会尝试使用无效(太大)索引访问data。如果左边的第一个条件已经为False,则不评估and运算符右侧的条件,因此在这种情况下没有错误。

我们一直持续到列表结束。

如果'start'标记没有和'end'标记,则结果blocks列表中会留下最后一个空块。