2017-04-15 89 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除外)。

相關問題