11

単語のリスト内の文字列のすべてのインデックス位置を見つけようとしていますが、値をリストとして返す必要があります。文字列が単独である場合、または句読点が前後にある場合は文字列を検索したいと思いますが、それがより大きな単語の部分文字列である場合は検索しません。

次のコードは、"cow" のみをキャプチャし、"test;cow" と "cow" の両方を見逃しています。

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

正規表現を使用するようにコードを変更しようとしました:

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

しかし、これによりエラーが発生します: 文字列またはバッファが必要です

誰かが私が間違っていることを知っているなら、私は聞いてとてもうれしいです. 文字列を期待しているときに正規表現を使用しようとしているという事実と関係があると感じています。解決策はありますか?

私が探している出力は次のようになります。

>> [0, 4, 5]

ありがとう

4

2 に答える 2

21

matchbackの結果を に代入する必要はありませんx。そして、あなたの試合はxではなくオンにする必要がありますlist

また、正規表現パターンが最初の要素と一致しないため、re.search代わりにを使用する必要があります。と一致しないためです。実際には、完全な文字列ではなく、直後と直前の文字をテストするだけで済みます。re.match'\W*myString\W*'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)]
于 2013-02-11T19:13:55.877 に答える
5

コードにはいくつかの問題があります。xまず、リスト全体 ( ) ではなく、リスト要素 ( ) に対して expr を照合する必要がありますmyList。次に、式に変数を挿入するには、+(文字列連結) を使用する必要があります。最後に、生のリテラル ( r'\W) を使用して、expr 内のスラッシュを適切に解釈します。

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

myString に特別な正規表現文字 (スラッシュやドットなど) が含まれる可能性がある場合は、それに適用re.escapeする必要もあります。

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

コメントで指摘されているように、次の方法がより適切なオプションである可能性があります。

regex = r'\b' + re.escape(myString) + r'\b'
indices = [i for i, x in enumerate(myList) if re.search(regex, x)]
于 2013-02-11T19:15:52.993 に答える