Reguläre Ausdrücke: In Liste suchen

87

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)]?

Leoluk
quelle

Antworten:

114

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(..)).

sepp2k
quelle
2
Tatsächlich werden Listenverständnisse normalerweise funktionalen Konstrukten wie Filtern, Reduzieren, Lambda usw.
Ivo van der Wijk
37
@Ivo: Sie werden normalerweise bevorzugt, weil sie normalerweise klarer und oft prägnanter sind. In diesem Fall ist die filterVersion jedoch vollkommen klar und weist viel weniger Rauschen auf.
sepp2k
9
was ist r.matchhier
Rbatt
2
@rbatt 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).
sepp2k
166

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).

Python 3-Codebeispiel
Python 2.x-Codebeispiel

Merkur
quelle
4
Hallo, wenn ich den obigen Code ausführe, bekomme ich <filter object at 0x1057acda0>Was mache ich falsch?
1
Gemäß Python-Dokumenten (Python 2.7.12): Der Filter docs.python.org/2/library/functions.html#filter gibt eine Liste zurück, die kein Objekt ist. Sie können diesen Code auch überprüfen: repl.it/X3G/5786 ( drücken Sie einfach run)
Mercury
1
Vielen Dank. Ich verwende Python 3.5.2 auf einem Mac. Ich habe deinen Link ausprobiert. Natürlich funktioniert es, obwohl ich nicht sicher bin, warum ich diese Nachricht bekomme. Ich habe sogar die strseitdem filterzurückgegebene Liste sowieso entfernt, ohne Erfolg ...
4
@ Joshua Sie haben das wahrscheinlich schon herausgefunden, aber versuchen Sie es print(list(newlist))oderprint([i for i in newlist])
James Draper
1
Das ist lächerlich schwierig. Deshalb ist R überlegen. Einfach grep (Muster, vector_of_names)
MadmanLee
1

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.

Collin Heist
quelle