Я хочу фільтрувати рядки у списку на основі регулярного виразу.
Чи є щось краще, ніж [x for x in list if r.match(x)]?
Відповіді:
Ви можете створити ітератор у Python 3.x або список у Python 2.x, використовуючи:
filter(r.match, list)
Щоб перетворити ітератор Python 3.x у список, просто додайте його; list(filter(..)).
filterверсія абсолютно чітка і має набагато менше шуму.
r.matchтут?
r.match- це метод, який при застосуванні до даного рядка виявляє, чи відповідає регулярний вираз rцьому рядку (і повертає відповідний об'єкт відповідності, якщо так, але це не має значення в цьому випадку, оскільки нам просто важливо, чи результат є істинним)
Повний приклад (Python 3):
Для Python 2.x зверніться до Примітки нижче
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Друк:
['cat', 'wildcat', 'thundercat']
Примітка:
Для розробників Python 2.x filterвже повертає список. У Python 3.xfilter було змінено, щоб повернути ітератор, тому його потрібно перетворити list(для того, щоб побачити його добре роздрукованим).
<filter object at 0x1057acda0>Що я роблю не так?
strоскільки filterповертає список у будь-якому випадку, безрезультатно ...
print(list(newlist))абоprint([i for i in newlist])
Щоб зробити це без попереднього складання регулярного виразу, скористайтеся lambdaфункцією - наприклад:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Повернення:
['123', '234']
filter()просто приймає callableяк перший аргумент і повертає список, де той, що викликається, повертає значення "істинно".