2017-05-31 10 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'の先頭に追加するだけですか?最初の文字は**常に**数値です。申し訳ありませんが、それを指定していない、2M以上の条件があり、私はそれをキャッチしませんでした。 –

+0

'\ d +'パターンは数字列にマッチしますが、用語が複雑な場合は、別のパターンを使用できます。おそらく '\ d \ w *'か何かがあなたの実際の値と一致します(文字と数字の後に "word"文字が続き、アンダースコアと一致します)。より具体的な文字クラスを使うことができます:例えば、\ d [A-Z0-9] 'は数字と首都文字のみを許可します。 – Blckknght

+0

'\ d \ w *'は完全に機能しました。ご協力ありがとうございました! –

関連する問題