【问题标题】:Regular Expressions: Search in list正则表达式:在列表中搜索
【发布时间】:2011-04-08 02:37:19
【问题描述】:

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

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

【问题讨论】:

    标签: python regex


    【解决方案1】:

    完整示例(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(以便很好地看到它打印出来)。

    Python 3 code example
    Python 2.x code example

    【讨论】:

    • 你好,当我运行上面的代码时,我得到<filter object at 0x1057acda0>我做错了什么?
    • 根据 python 文档(python 2.7.12):docs.python.org/2/library/functions.html#filter 过滤器返回一个列表而不是一个对象。您还可以检查该代码:repl.it/X3G/5786(只需点击运行)
    • 谢谢。我在 Mac 上使用 Python 3.5.2。我试过你的链接。当然它有效,虽然不知道为什么我得到那个味精。我什至删除了str,因为filter 无论如何都会返回一个列表,但无济于事......
    • @joshua 你现在可能已经想通了,但是试试print(list(newlist))print([i for i in newlist])
    • 这太难了。这就是为什么R更胜一筹。简单的 grep(pattern, vector_of_names)
    【解决方案2】:

    您可以使用以下方法在 Python 3.x 中创建 iterator 或在 Python 2.x 中创建 列表

    filter(r.match, list)
    

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

    【讨论】:

    • 实际上,列表推导通常比过滤器、归约、lambda 等函数构造更受欢迎。
    • @Ivo:它们通常是首选,因为它们通常更清晰,更简洁。但是在这种情况下,filter 版本非常清晰,噪音要小得多。
    • 这里的r.match 是什么?
    • @rbatt r.match 是一种方法,当应用于给定字符串时,它会查找正则表达式 r 是否匹配该字符串(如果匹配,则返回相应的匹配对象,但事实并非如此在这种情况下很重要,因为我们只关心结果是否真实)
    • 谁能举个例子?在哪里传递搜索掩码?
    【解决方案3】:

    要在不先编译 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 作为它的第一个参数,并返回一个列表,其中该可调用对象返回一个“真实”值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 2013-11-02
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2014-06-06
      • 2014-06-02
      • 2023-04-10
      相关资源
      最近更新 更多