2016-06-12 3 views
1

私は、文字列strlstと正規表現rexlstのリストのリストを持っている場合は、rexlst試合での正規表現のどのなしためstrlstのすべての要素をフィルタリングするための最も神託の方法は何ですか?したがって、rexlstの通常のエフェクトの1つがstrlstの文字列と一致するとすぐに、この特定の文字列を出力リストに含める必要があります。 追加された合併症*は、strlstの最初のの要素がrexlstの最初の正規表現と一致すると一致し、次に2番目とs.o.正規表現のリストで正規表現のリストを文字列のリストにフィルタリングする最も無作法な方法は何ですか?

A非常に簡単な例:これは、strlstreglistいずれかの任意の組み合わせの原因作業べき

outlst = ['aaaaaa', 'bbbbb', '1234'] 

import re 
strlst = ['aaaaaa', '1234', 'bbbbb', '------', '.+/4-3', 'a1b2c3'] 
rexlst = [re.compile(x) for x in [r'^[a-z]+$', r'^\d+$']] 

募集結果はoutputlistあります。プラスは合理的に効率的で短期間のソリューションです。

outlist = filter(lambda x: any([True if r.match(x) else False for r in rexlst]), strlst) 

しかし、それは、間違った順序、彼らはstrlstに表示される、すなわち、それは文字列の順序を保持できます::

私が思い付くことができる最高です

outlst = ['aaaaaa', '1234', 'bbbbb'] 

答えて

2

を簡単な要素の削除のために文字列のリストをsetに変換してから、残りの文字列をループして、正規表現が一致するかどうかを確認してください。あなたは、反復しながら、セットから要素を削除するに注意してください、そうコピーを毎回行う必要があります。

tomatch = set(strlst) 
outlist = [] 
for regex in rexlst: 
    for value in set(tomatch): 
     if regex.match(value): 
      outlist.append(value) 
      tomatch.remove(value) 

これは、リスト内包表記に変換することができますが、これは読みやすさを傷つけるん:

tomatch = set(strlst) 
outlist = [v for regex in rexlst for v in set(tomatch) if regex.match(v) and not tomatch.remove(v)] 

これらの作品strlstの文字列が複数の正規表現に一致する場合でも同じです。

>>> tomatch 
set(['.+/4-3', 'a1b2c3', '------']) 
:リスト内包の

デモは:それはすべてのヘルプであれば

>>> import re 
>>> strlst = ['aaaaaa', '1234', 'bbbbb', '------', '.+/4-3', 'a1b2c3'] 
>>> rexlst = [re.compile(x) for x in [r'^[a-z]+$', r'^\d+$']] 
>>> tomatch = set(strlst) 
>>> [v for regex in rexlst for v in set(tomatch) if regex.match(v) and not tomatch.remove(v)] 
['aaaaaa', 'bbbbb', '1234'] 

あなたはtomatchに比類のない文字列が残っています

関連する問題