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)]?
Antworten:
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(..)).
filterVersion jedoch vollkommen klar und weist viel weniger Rauschen auf.
r.matchhier
r.matchist eine Methode, die bei Anwendung auf eine bestimmte Zeichenfolge ermittelt, ob der reguläre Ausdruck rmit 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 filterbereits eine Liste zurück. In Python 3.xfilter wurde geändert, um einen Iterator zurückzugeben, sodass dieser konvertiert werden muss list(damit er gut ausgedruckt wird).
<filter object at 0x1057acda0>Was mache ich falsch?
strseitdem filterzurü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 a callableals erstes Argument und gibt eine Liste zurück, in der dieser aufrufbare Wert einen "wahrheitsgemäßen" Wert zurückgibt.