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:
Ş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(..)).
filtersürüm tamamen nettir ve çok daha az gürültüye sahiptir.
r.matchburada ne var
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)
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).
strberi kaldırdım bile filter, boşuna ...
print(list(newlist))ya daprint([i for i in newlist])
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.