Chcę filtrować ciągi znaków na liście na podstawie wyrażenia regularnego.
Czy jest coś lepszego niż [x for x in list if r.match(x)]
?
Odpowiedzi:
Możesz utworzyć iterator w Pythonie 3.x lub listę w Pythonie 2.x przy użyciu:
filter(r.match, list)
Aby przekonwertować iterator Pythona 3.x na listę, po prostu rzuć go; list(filter(..))
.
filter
wersja jest doskonale czytelna i ma znacznie mniejszy hałas.
r.match
tu jest
r.match
to metoda, która po zastosowaniu do danego ciągu sprawdza, czy wyrażenie regularne r
pasuje do tego ciągu (i zwraca odpowiedni obiekt dopasowania, jeśli tak, ale to nie ma znaczenia w tym przypadku, ponieważ zależy nam tylko na tym, czy wynik jest prawdziwy)
Pełny przykład (Python 3):
W przypadku języka Python 2.x zajrzyj do poniższej uwagi
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Wydruki:
['cat', 'wildcat', 'thundercat']
Uwaga:
W przypadku programistów Python 2.x filter
zwraca już listę. W Pythonie 3.xfilter
został zmieniony, aby zwracał iterator, więc musi zostać przekonwertowany list
(aby ładnie go wydrukować).
str
filter
print(list(newlist))
lubprint([i for i in newlist])
Aby to zrobić bez najpierw kompilowania Regex, użyj lambda
funkcji - na przykład:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Zwroty:
['123', '234']
filter()
po prostu przyjmuje callable
jako pierwszy argument i zwraca listę, na której ten wywoływany zwrócił wartość „prawdziwą”.