Normal İfadeler: Listede ara


91

Bir listedeki dizeleri normal ifadeye göre filtrelemek istiyorum.

Daha iyi bir şey var mı [x for x in list if r.match(x)]?

Yanıtlar:


116

Şunları kullanarak Python 3.x'te bir yineleyici veya Python 2.x'te bir liste oluşturabilirsiniz:

filter(r.match, list)

Python 3.x yineleyiciyi bir listeye dönüştürmek için , onu yayınlayın; list(filter(..)).


2
Aslında, liste anlamaları genellikle filtreleme, azaltma, lambda vb. Gibi işlevsel yapılara tercih edilir.
Ivo van der Wijk 4'10

39
@Ivo: Genellikle daha net ve özlü oldukları için tercih edilirler. Ancak bu durumda, filtersürüm tamamen nettir ve çok daha az gürültüye sahiptir.
sepp2k

9
r.matchburada ne var
rbatt

2
@rbatt r.match, belirli bir dizeye uygulandığında, normal ifadenin rbu dizeyle eşleşip eşleşmediğini bulan (ve eğer öyleyse karşılık gelen bir eşleşme nesnesi döndüren, ancak bu durumda önemli değil, çünkü sonucun doğru olup olmadığını önemsiyoruz)
sepp2k

175

Tam Örnek (Python 3):
Python 2.x için aşağıdaki Nota bakın

import re

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

Baskılar:

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

Not:

Python 2.x geliştiricileri için filterzaten bir liste döndürür. İçinde Python 3.xfilter bu dönüştürülebilir bulunmaktadır, bu yüzden bir yineleyici dönmek için değiştirildi list(o güzel basılmış görmek için).

Python 3 kod örneği
Python 2.x kod örneği


4
Merhabalar, Yukarıdaki kodu çalıştırdığımda <filter object at 0x1057acda0>Neyi yanlış yapıyorum?

1
Python belgelerine (python 2.7.12) göre: docs.python.org/2/library/functions.html#filter filtresi, nesne değil liste döndürür. Şu kodu da kontrol edebilirsiniz: repl.it/X3G/5786 (sadece koşmaya bas )
Mercury

1
Teşekkür ederim. Mac'te Python 3.5.2 kullanıyorum. Bağlantınızı denedim. Elbette işe yarıyor, ancak neden bu mesajı aldığımı bilmiyorum. Yine de bir liste döndürdüğünden strberi kaldırdım bile filter, boşuna ...

4
@joshua muhtemelen bunu şimdiye kadar çözdünüz ama deneyin print(list(newlist))ya daprint([i for i in newlist])
James Draper

1
Bu gülünç derecede zor. Bu nedenle R üstündür. Simply grep (pattern, vector_of_names)
MadmanLee

1

Bunu önce Regex'i derlemeden yapmak için bir lambdaişlev kullanın - örneğin:

from re import match

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

print(filtered_values)

İadeler:

['123', '234']

filter()callableilk argüman olarak sadece a'yı alır ve çağrılabilirliğin 'doğru' bir değer döndürdüğü bir liste döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.