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


87

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

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

Answers:


114

您可以使用以下命令在Python 3.x中创建迭代器或在Python 2.x中创建列表

filter(r.match, list)

要将Python 3.x迭代器转换为列表,只需对其进行转换;list(filter(..))


2
实际上,列表解析通常者优先在功能结构,如过滤器,降低,λ,等等
伊沃范德瓦Wijk

37
@Ivo:通常首选它们,因为它们通常更清晰,更简洁。但是,在这种情况下,该filter版本非常清晰,噪音也小得多。
sepp2k 2010年

9
这是r.match什么
rbatt

2
@rbattr.match是一种方法,当应用于给定的字符串时,它查找正则表达式是否r与该字符串匹配(如果匹配,则返回相应的匹配对象,但是在这种情况下无关紧要,因为我们只是在乎结果是否真实)
sepp2k 18-10-12

167

完整示例(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代码示例
Python 2.x代码示例


4
您好,当我运行上面的代码时,我得到<filter object at 0x1057acda0>我在做什么错?

1
根据python docs(python 2.7.12):docs.python.org/2/library/functions.html#filter过滤器返回的列表不是对象。您还可以检查以下代码: repl.it/X3G/5786 (刚刚运行)
Mercury

1
谢谢。我在Mac上使用Python 3.5.2。我尝试了您的链接。当然可以,但是不确定为什么我会得到该味精。我什至删除了str从此以来filter返回的列表,但无济于事……

4
@joshua你现在大概想通了这一点,但尝试print(list(newlist))print([i for i in newlist])
詹姆斯德雷珀

1
这是非常荒谬的。这就是为什么R是优越的。只是grep(pattern,vector_of_names)
MadmanLee

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.