正規表現:リストで検索


91

正規表現に基づいてリスト内の文字列をフィルタリングしたい。

より良いものはあり[x for x in list if r.match(x)]ますか?

回答:


116

次を使用して、Python3.xイテレータを作成するかPython2.xリストを作成できます。

filter(r.match, list)

Python 3.xイテレータをリストに変換するには、キャストするだけです。list(filter(..))


2
実際には、リストの内包は、通常など、そのようなフィルタなどの機能構築物上に好ま低減、ラムダれる
Wijkデアイボヴァン

39
@Ivo:通常はより明確で、多くの場合より簡潔であるため、通常は好まれます。ただし、この場合、filterバージョンは完全にクリアで、ノイズがはるかに少なくなります。
sepp2k 2010

9
r.matchここは何ですか?
rbatt 2018年

2
@rbattr.matchは、指定された文字列に適用されると、正規表現がrその文字列と一致するかどうかを検出するメソッドです(一致する場合は、対応する一致オブジェクトを返しますが、この場合は、結果が正しいかどうかだけを気にするため、問題ではありません)。
sepp2k

175

完全な例(Python 3):
Python 2.xについては、以下の注を参照してください

import re

mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)

プリント:

['cat', 'wildcat', 'thundercat']

注意:

Python 2.x開発者の場合、filterすでにリストを返します。でPythonの3.xのfilterそれに変換されなければならないので、イテレータを返すように変更されたlist(それがうまくプリントアウトを参照するために)。

Pythonの3コードの例
のPython 2.xのコード例


4
こんにちは。上記のコードを実行すると、<filter object at 0x1057acda0>何が間違っているのでしょうか。

1
python docs(python 2.7.12)によると:docs.python.org/2/library/functions.html#filter filterは、オブジェクトではなくリストを返します。次のコードも確認できます: repl.it/X3G/5786 (実行を押すだけ)
Mercury

1
ありがとうございました。MacでPython3.5.2を使用しています。私はあなたのリンクを試しました。もちろん、それは機能しますが、なぜそのメッセージを受け取るのかはわかりません。とにかくリストを返すstrので、私も削除しましたfilterが、

4
@joshuaあなたはおそらく、今では、このうちを考え出したが試すきたprint(list(newlist))print([i for i in newlist])
ジェームズ・ドレイパー

1
これは途方もなく難しいです。これがRが優れている理由です。単純にはgrep(パターン、vector_of_names)
MadmanLee

1

最初に正規表現をコンパイルせずにこれを行うには、次のlambda関数を使用します。

from re import match

values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))

print(filtered_values)

戻り値:

['123', '234']

filter()callable最初の引数としてaを取り、その呼び出し可能オブジェクトが「真の」値を返したリストを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.