2017-07-18 7 views
0

ワイルドカード検索が真である場合はboolとしたいと思います。具体的には、次のものが存在する場合:_<any number or char>_ワイルドカード文字の一致

理想的には、私はエレガントな無声の方法を探したいと思います。たとえば、anyは完全一致の場合はtrueを返します。ワイルドカードに相当するものはありますか?明確にするため

>>> lst = ['cherry', 'pineapple_1', 'apple', '_olive', 'banana_split_1'] 
>>> any('_.' in elem for elem in lst) 
False 
>>> any('_' in elem for elem in lst) 
True 
>>> any('_*_' in elem for elem in lst) 
False 

、2番目のコマンドは、2つのアンダースコア間の文字を含む'banana_split_1'要素のTrue B/Cを返すべきです。

+3

あなたはこの問題を 'regex'とタグ付けしました。これは明白な解決策です。正規表現を使ってどんな問題がありますか? – Prune

+0

@Prune、はい私は解決策に 're'が含まれると仮定しますが、式を構築するのは難しいです。また、完全一致の場合は 'any'に似たアプローチがあるかどうかを確認したい。 –

+0

これらのマッチの鍵は 'in'で、' any'ではなく 're'がツールです。 – Prune

答えて

2

あなたは常にstr.find()使用することができ、それはおそらく、あまりにも、このような単純なパターンのための最速のようになります。

>>> lst = ['cherry', 'pineapple_1', 'apple', '_olive', 'banana_split_1'] 
>>> any(x.find('_', x.find('_') + 2) != -1 for x in lst) 
True 

EDIT - 説明:それはlstのすべての要素をループして見つけようとしますアンダースコアにはアンダースコアが続き、アンダースコアの間には少なくとも1つの文字が含まれていなければなりません。検討単一のケースのためにそれを解明:

>>> test = 'banana_split_1' 
>>> index = test.find('_') # 6, the index of the first underscore 
>>> index2 = test.find('_', index + 2) # 12, the index of the next underscore 
>>> index2 != -1 
True 

index2は-1になり、テスト中の(それは少なくとも一つの間に文字を必要とするように、右に2つのスペースにより除去)は、第2のアンダーなかった場合上記の発電機は故障する。

これは明らかに一致が見つかるまで、またはany()Falseを返すまで、すべてのエントリに対して繰り返されます。

+0

これは、パターン "_?_"(アンダースコアの間の1文字)では動作しますが、要求された場合は "banana_split_1"の例のように "_ * _"(英数字文字列)では機能しません。 – Prune

+0

解決策を教えていただけますか? –

+0

@Prune - これは、2つのアンダースコアの間の任意の数の文字(> 1)で機能します。 – zwer

0

これは何か?

for elem in list: 
    if bool(re.search(expression, elem)): 
     return True 
return False 
0

私はあなたが必要とするキー項目は、このような_[0-9A-Za-z]+_

0-9 digits 
A-Z upper-case 
a-z lower-case 
[] any one of these characters 
+ at least one repetition (disallows null string) 

として英数字の記述、サラウンドアンダースコアでは、と私はそれがあなたの検索パターンだと考えていると思います。

+0

ありがとう、私はそれを試してみます。それは働くことができます。 'search'や' match'を使いますか? –

+0

私はインストラクターの帽子をつけるつもりです:[正規表現のチュートリアル](https://docs.python.org/2/howto/regex.html)を見て、*すべて*を学んでください(もちろん、あなたの基礎の今日を吸収するように感じる)。 – Prune

関連する問題