我想根据正则表达式过滤列表中的字符串。
是否有比[x for x in list if r.match(x)]
更好的东西?
答案 0 :(得分:85)
完整示例(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.x filter
中更改为返回迭代器,因此必须将其转换为list
(为了看到它打印得很好)。
答案 1 :(得分:83)
您可以使用以下命令在Python 3.x中创建迭代器或在Python 2.x中创建列表:
filter(r.match, list)
要将Python 3.x 迭代器转换为列表,只需将其转换为; list(filter(..))
。
答案 2 :(得分:10)
以防万一将来有人来这里,还有另一种Python方式可以做到这一点。首先,您需要创建regex
,然后创建filter
import re
inilist =["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
regex = re.compile(r'.*cat')
selectobj = filter(regex.search, inilist)
selectobj
结果:
['cat', 'wildcat', 'thundercat']
答案 3 :(得分:1)
要这样做而不先编译正则表达式,请使用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
作为其第一个参数,并返回一个列表,该可调用项返回一个“真实的”值。