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(..)).
filterwersja jest doskonale czytelna i ma znacznie mniejszy hałas.
r.matchtu jest
r.matchto metoda, która po zastosowaniu do danego ciągu sprawdza, czy wyrażenie regularne rpasuje 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 filterzwraca już listę. W Pythonie 3.xfilter został zmieniony, aby zwracał iterator, więc musi zostać przekonwertowany list(aby ładnie go wydrukować).
strfilter
print(list(newlist))lubprint([i for i in newlist])
Aby to zrobić bez najpierw kompilowania Regex, użyj lambdafunkcji - 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 callablejako pierwszy argument i zwraca listę, na której ten wywoływany zwrócił wartość „prawdziwą”.