2017-02-07 26 views
1

パターン一致がいくつか行われていて、文字列の一部が文字列のリストに含まれているかどうかを確認する必要があります。このような 行う何か:一致すると一致するものが返される

if any(x in line for x in aListOfValues):

は、それがラインに加えて、xの値を返すことは可能ですか?

+0

が重複する可能性のiterableから最初の項目を取得するための最良の方法は何ですか条件にマッチするか?](http://stackoverflow.com/questions/2361426/what-is-the-best-way-to-get-the-first-item-from-aniterable-matching-a-condition) –

答えて

3

next()を使用して、類似のジェネレータから次の一致を取得することができます。Falseがデフォルトです。これは、最初にの一致を返すだけであることに注意してください。

match = next((x for x in aListOfValues if x in line), False) 

また、非常に簡単な解決策は、単にループにあなたの現在の文を分解し、xを含むタプルと同様に行を返すことである可能性があります。

def find(line, aListOfValues): 
    for x in aListOfValues: 
     if x in line: 
      return x, line 
    return False, line 
+1

また、 'next' ** only **は条件がTrueの最初の項目を返します。複数の場合はすべてではありません。少なくともここではそれは使われていない。 –

+0

@ Ev.Kounis私はOPの質問からそれを解釈しましたが、確かに、私はそれをより明確にしました。 – miradulo

+1

ありがとうございました。あなたの "マッチ"解決策に立ち向かいました。 – Conor

1

あなたは、最初のアイテムを消費することによってそれを行うことができnextを使用して一致に戻りました。あなたはパターンを見つけるつもりだわからない場合は、StopIteration例外から保護しなければならないことに注意してください:[の

try: 
    print (next(x for x in aListOfValues if x in line)) 
except StopIteration: 
    print("Not found") 
0
aListOfValues = ["hello", "hallo"] 
line = "hello world" 
#classic one 
res = [x for x in aListOfValues if x in line] 
print res 
>>['hello'] 

# back to your case 
if any(x in line for x in aListOfValues): 
    print set(aListOfValues) & set(line.split()) 
>> set(['hello']) 

match = set(aListOfValues) & set(line.split()) 
if match: #replace any query 
    print match 
>> set(['hello']) 
関連する問題