Voglio filtrare le stringhe in un elenco in base a un'espressione regolare.
C'è qualcosa di meglio di [x for x in list if r.match(x)]?
Risposte:
Puoi creare un iteratore in Python 3.x o un elenco in Python 2.x usando:
filter(r.match, list)
Per convertire l' iteratore Python 3.x in un elenco, è sufficiente eseguirne il cast; list(filter(..)).
filterversione è perfettamente nitida e ha molto meno rumore.
r.matchqui?
r.matchè un metodo che, quando applicato a una determinata stringa, trova se la regex rcorrisponde a quella stringa (e restituisce un oggetto match corrispondente in tal caso, ma in questo caso non importa perché ci interessa solo se il risultato è veritiero)
Esempio completo (Python 3):
per Python 2.x guarda la nota sotto
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Stampe:
['cat', 'wildcat', 'thundercat']
Nota:
Per gli sviluppatori Python 2.x, filterrestituisce già un elenco. In Python 3.x èfilter stato modificato per restituire un iteratore, quindi deve essere convertito inlist (per vederlo stampato bene).
<filter object at 0x1057acda0>cosa sto facendo di sbagliato?
strdato che filterrestituisce comunque un elenco, senza alcun risultato ...
print(list(newlist))oprint([i for i in newlist])
Per farlo senza compilare prima il Regex, usa una lambdafunzione, ad esempio:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Ritorna:
['123', '234']
filter()prende solo un callablecome primo argomento e restituisce un elenco in cui quel chiamabile ha restituito un valore "true".