语言: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)
这会给我一个错误,我想因为你只能在字符串中使用它而不是列表。
答案 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
除外)。