2017-04-15 92 views
1

语言:Python的3.4 操作系统:Windows 8.1找到两个标签之间的元素列表中的

我有一些列表如下所示:

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

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

即使列表和标签具有可变数量的元素或可变长度,我也希望能够得到它。例如:获取text1和text4之间的元素或者text1或text5等。或者获取长度更长的text1和text5之间的元素。

我试图使用像正则表达式:

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

这会给我一个错误我猜,因为你只能使用这一个字符串,但没有列出。

回答

2

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

代码:

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

结果:

['text4', 'New_element'] 
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除外)。

相关问题