2017-05-31 51 views
0

我有一個list追加_在列表中,與多個啓動項目的開始「(」

lst = ['(234A2) or (47) and 86', '(((56 or 2B2E1) and 623) and not 876) or 111'] 

我想同時保留()結構

在每個項目前加一個 _
['(_234A2) or (_47) and _86', '(((_56 or _2B2E1) and _623) and not _876) or _111'] 

我已經試過

lst_split = [] 

for item in lst: 
    lst_split = item.split() 

append_lst = [] 
for item in lst_split: 
    if item[0].isdigit(): 
     item = '_' + item 
     append_lst.append(item) 
append_lst 

['_2B2E1)', '_623)', '_876)', '_111'] 

我將如何添加_以任何數量的(開頭的項目,以及使用列表理解實現此目的的更簡潔的方法是什麼?

回答

1

這似乎是一個好地方,使用正則表達式:

import re 

def prefix_numbers(lst): 
    return [re.sub('\d+', lambda match: '_' + match.group(), item) for item in lst] 

輸出示例:

>>> lst = ['(234) or (47) and 86', '(((56 or 22) and 623) and not 876) or 111'] 
>>> prefix_numbers(lst) 
['(_234) or (_47) and _86', '(((_56 or _22) and _623) and not _876) or _111'] 
+0

這不正是我問,謝謝!在我申請之後,我意識到我的一些術語中有一些字母字符(即'123A423'),這種方法產生了'_123A_423'。我將如何忽略字母字符,只追加到_123A423開頭?第一個字符**總是**數字值。對不起,我沒有詳細說明,有超過200萬條款,我沒有收到。 –

+0

'\ d +'模式匹配數字序列,如果您的術語更復雜,則可以使用不同的模式。或許'\ d \ w *'或其他符合您實際值的值(匹配數字後跟任何「單詞」字符,即字母和數字,再加下劃線)。你可以使用一個字符類更具體:'\ d [A-Z0-9]'例如只允許數字和大寫字母。 – Blckknght

+0

'\ d \ w *'完美運作。感謝您的幫助! –

相關問題