在列表中查找两个标记之间的元素

时间:2017-04-15 04:38:11

标签: python python-3.x

语言:Python 3.4 操作系统:Windows 8.1

我有一些如下列表:

a = ['text1', 'text2', 'text3','text4','text5']
b = ['text1', 'text2', 'text3','text4','New_element', 'text5']

在列表中找到两个标记之间元素的最简单方法是什么?

即使列表和标签具有可变数量的元素或可变长度,我也希望能够得到它。

Ex:获取text1和text4或text1或text5等之间的元素。或者获取text1和text5之间具有更长篇幅的元素。

我尝试使用正则表达式,如:

re.findall(r'text1(.*?)text5', a)

这会给我一个错误,我想因为你只能在字符串中使用它而不是列表。

2 个答案:

答案 0 :(得分:2)

要获取列表中元素的位置,请使用index()。然后使用发现的索引创建列表的切片,如:

<强>代码:

print(b[b.index('text3')+1:b.index('text5')])

<强>结果:

['text4', 'New_element']

答案 1 :(得分:1)

您可以使用list.index方法查找每个标记的第一个匹配项,然后对列表进行切片以获取索引之间的值。

def find_between_tags(lst, start_tag, end_tag):
    start_index = lst.index(start_tag)
    end_index = lst.index(end_tag, start_index)
    return lst[start_index + 1: end_index]

如果其中一个标记不在列表中(或者结果标记仅出现在开始标记之前),则其中一个index调用将引发ValueError。如果你想做其他事情,你可以抑制异常,但只是让调用者处理它对我来说似乎是一个合理的选择,所以我没有留下未被捕获的例外。

如果标签可能多次出现在此列表中,您可以扩展上述函数的逻辑以查找所有这些标记。为此,您要使用start list.index参数,这将告诉它不要查看前一个结束标记之前的值。

def find_all_between_tags(lst, start_tag, end_tag):
    search_from = 0
    try:
        while True:
            start_index = lst.index(start_tag, search_from)
            end_index = lst.index(end_tag, start_index + 1)
            yield lst[start_index + 1:end_index]
            search_from = end_index + 1
    except ValueError:
        pass

此生成器会取消ValueError,因为它会继续搜索,直到找不到另一对标记。如果标签不存在于列表中的任何位置,则生成器将为空,但它不会引发任何异常(StopIteration除外)。