正则表达式:在列表中搜索

时间:2010-09-04 00:13:19

标签: python regex

我想根据正则表达式过滤列表中的字符串。

是否有比[x for x in list if r.match(x)]更好的东西?

4 个答案:

答案 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(为了看到它打印得很好)。

Python 3 code example
Python 2.x code example

答案 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作为其第一个参数,并返回一个列表,该可调用项返回一个“真实的”值。