Ich möchte Zeichenfolgen in einer Liste basierend auf einem regulären Ausdruck filtern.
Gibt es etwas besseres als [x for x in list if r.match(x)]
?
Sie können einen Iterator in Python 3.x oder eine Liste in Python 2.x erstellen, indem Sie Folgendes verwenden:
filter(r.match, list)
Um den Python 3.x- Iterator in eine Liste zu konvertieren, wandeln Sie ihn einfach um. list(filter(..))
.
filter
Version jedoch vollkommen klar und weist viel weniger Rauschen auf.r.match
hierr.match
ist eine Methode, die bei Anwendung auf eine bestimmte Zeichenfolge ermittelt, ob der reguläre Ausdruckr
mit dieser Zeichenfolge übereinstimmt (und in diesem Fall ein entsprechendes Übereinstimmungsobjekt zurückgibt. In diesem Fall spielt dies jedoch keine Rolle, da es uns nur darum geht, ob das Ergebnis wahr ist).Vollständiges Beispiel (Python 3):
Für Python 2.x siehe Hinweis unten
import re mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"] r = re.compile(".*cat") newlist = list(filter(r.match, mylist)) # Read Note print(newlist)
Drucke:
['cat', 'wildcat', 'thundercat']
Hinweis:
Gibt für Python 2.x-Entwickler
filter
bereits eine Liste zurück. In Python 3.xfilter
wurde geändert, um einen Iterator zurückzugeben, sodass dieser konvertiert werden musslist
(damit er gut ausgedruckt wird).Python 3-Codebeispiel
Python 2.x-Codebeispiel
quelle
<filter object at 0x1057acda0>
Was mache ich falsch?str
seitdemfilter
zurückgegebene Liste sowieso entfernt, ohne Erfolg ...print(list(newlist))
oderprint([i for i in newlist])
Verwenden Sie dazu a, ohne zuvor den Regex zu kompilieren
lambda
Funktion - zum Beispiel:from re import match values = ['123', '234', 'foobar'] filtered_values = list(filter(lambda v: match('^\d+$', v), values)) print(filtered_values)
Kehrt zurück:
['123', '234']
filter()
nimmt nur acallable
als erstes Argument und gibt eine Liste zurück, in der dieser aufrufbare Wert einen "wahrheitsgemäßen" Wert zurückgibt.quelle