2013-02-11 1 views
7

文字列のすべてのインデックス位置を単語リストに配置しようとしていますが、値をリストとして返すようにします。私は文字列がそれ自身であるか、句読点の前後にあるが、それが大きな単語の部分文字列でない場合は、文字列を探したいと思う。正規表現をPythonのリストの理解にどのように使用しますか?

次のコードでは、「牛」のみがキャプチャされ、「テスト;牛」と「牛」の両方が表示されません。

import re 
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] 
myString = 'cow' 
indices = [i for i, x in enumerate(myList) if x == re.match('\W*myString\W*', myList)] 
print indices 

しかし、これはエラーを与える:予想文字列または誰かが私が間違ってやっていることを知っている場合は

をバッファリングし、私は正規表現を使用するためにコードを変更しようとしている

myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] 
myString = 'cow' 
indices = [i for i, x in enumerate(myList) if x == myString] 
print indices 
>> 5 

聞くのがとてもうれしいです。私はそれが文字列を期待しているときにそこで正規表現を使用しようとしているという事実と関係があると感じています。解決策はありますか?

私が探している出力は読んでください:あなたが戻ってxからmatchの結果を割り当てる必要はありません

>> [0, 4, 5] 

おかげ

答えて

14

を。あなたの試合はlistではなく、xでなければなりません。

また、正規表現パターン'\W*myString\W*'が最初の要素と一致しないため、re.matchの代わりにre.searchを使用する必要があります。これは、test;\W*が一致しないためです。実際には、完全な文字列ではなく、直後の文字と直前の文字をテストする必要があります。

だから、あなたではなく、文字列の周りにword boundariesを使用することができます。

pattern = r'\b' + re.escape(myString) + r'\b' 
indices = [i for i, x in enumerate(myList) if re.search(pattern, x)] 
4

あなたのコードを持ついくつかの問題があります。まずリスト全体(myList)ではなく、リスト要素(x)に対してexprをマッチさせる必要があります。次に、式に変数を挿入するには、+(文字列の連結)を使用する必要があります。 (スラッシュドットのような)のmyStringは特殊な正規表現文字が含まれている可能性がある場合は、適用することも必要があります

import re 
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] 
myString = 'cow' 
indices = [i for i, x in enumerate(myList) if re.match(r'\W*' + myString + r'\W*', x)] 
print indices 

を:そして最後に、exprの中(r'\W)に適切にin​​terpetスラッシュ生のリテラルを使用それにre.escape

regex = r'\b' + re.escape(myString) + r'\b' 
indices = [i for i, x in enumerate(myList) if re.search(regex, x)] 
+0

はたぶんあまりに 're.escape'追加:コメントで指摘したように

regex = r'\W*' + re.escape(myString) + r'\W*' indices = [i for i, x in enumerate(myList) if re.match(regex, x)] 

、より良い選択肢かもしれません、次の? –

+0

@MartijnPieters:確かに、追加されました。 – georg

+0

これは、一致したい最初の要素と一致しません。 –

関連する問題