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)]
?
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 jestr.match
to metoda, która po zastosowaniu do danego ciągu sprawdza, czy wyrażenie regularner
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ć przekonwertowanylist
(aby ładnie go wydrukować).Przykład kodu w Pythonie 3 Przykład kodu w
Pythonie 2.x.
źródło
<filter object at 0x1057acda0>
Co robię źle?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 przyjmujecallable
jako pierwszy argument i zwraca listę, na której ten wywoływany zwrócił wartość „prawdziwą”.źródło