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

leo*_*luk 64 python regex

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

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

Mer*_*ury 113

完整示例(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)
Run Code Online (Sandbox Code Playgroud)

打印:

['cat', 'wildcat', 'thundercat']
Run Code Online (Sandbox Code Playgroud)

注意:

对于Python 2.x用户,filter已经返回一个列表.在Python 3.xfilter被更改为返回一个迭代器,所以它必须转换为list(为了看到它很好地打印).

Python 3代码示例
Python 2.x代码示例

  • 您好,当我运行上面的代码时,我得到`<filter object at 0x1057acda0>`我做错了什么? (4认同)
  • @joshua你现在可能已经想到了这个但是试试`print(list(newlist))`或`print([i for i in newlist]) (4认同)
  • 这是可笑的困难。这就是R优越的原因。简单的 grep(pattern, vector_of_names) (2认同)

sep*_*p2k 94

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

filter(r.match, list)
Run Code Online (Sandbox Code Playgroud)

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

  • @Ivo:他们通常是首选,因为他们通常更清晰,而且往往更简洁.但是在这种情况下,`filter`版本非常清晰,噪音更小. (29认同)
  • @rbatt `r.match` 是一种方法,当应用于给定的字符串时,它会查找正则表达式 `r` 是否与该字符串匹配(如果匹配则返回相应的匹配对象,但在这种情况下这并不重要,因为我们只关心结果是否真实) (3认同)
  • 实际上,列表推导式通常比过滤器、reduce、lambda 等函数式构造更受欢迎。 (2认同)
  • 这里的“ r.match”是什么? (2认同)
  • 首先 `import re`,第二个创建正则表达式 `r = re.compile(".*cat")` (2认同)

小智 5

要在不首先编译 Regex 的情况下执行此操作,请使用一个lambda函数 - 例如:

from re import match

values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))

print(filtered_values)
Run Code Online (Sandbox Code Playgroud)

返回:

['123', '234']
Run Code Online (Sandbox Code Playgroud)

filter()只需将 acallable作为第一个参数,并返回一个列表,其中该可调用对象返回一个“真实”值。