【发布时间】:2011-04-08 02:37:19
【问题描述】:
我想根据正则表达式过滤列表中的字符串。
还有比[x for x in list if r.match(x)]更好的东西吗?
【问题讨论】:
我想根据正则表达式过滤列表中的字符串。
还有比[x for x in list if r.match(x)]更好的东西吗?
【问题讨论】:
完整示例(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 below
print(newlist)
打印:
['cat', 'wildcat', 'thundercat']
注意:
对于 Python 2.x 开发人员,filter 已经返回一个列表。在Python 3.x filter 中更改为返回一个迭代器,因此必须将其转换为list(以便很好地看到它打印出来)。
【讨论】:
<filter object at 0x1057acda0>我做错了什么?
str,因为filter 无论如何都会返回一个列表,但无济于事......
print(list(newlist)) 或print([i for i in newlist])
您可以使用以下方法在 Python 3.x 中创建 iterator 或在 Python 2.x 中创建 列表:
filter(r.match, list)
要将 Python 3.x 迭代器 转换为列表,只需将其转换即可; list(filter(..)).
【讨论】:
filter 版本非常清晰,噪音要小得多。
r.match 是什么?
r.match 是一种方法,当应用于给定字符串时,它会查找正则表达式 r 是否匹配该字符串(如果匹配,则返回相应的匹配对象,但事实并非如此在这种情况下很重要,因为我们只关心结果是否真实)
要在不先编译 Regex 的情况下这样做,请使用 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 作为它的第一个参数,并返回一个列表,其中该可调用对象返回一个“真实”值。
【讨论】: