【问题标题】:Python list comprehension logic errorPython列表理解逻辑错误
【发布时间】:2011-09-28 11:41:31
【问题描述】:

我正在尝试使用正则表达式和列表理解来清除包含 "msi" 的字符串。但是,当我打印列表时,包含 "msi" 的字符串仍在列表中。错误究竟是什么?这是我的代码:

spam_list = [l for l in spam_list if not re.match("msi", l)]

【问题讨论】:

  • 最好不要使用list 作为变量名,因为它会影响内置函数

标签: python regex logic


【解决方案1】:

re.match() 从字符串的开头匹配。使用re.search(),或者更好的是in

L = [l for l in L if "msi" not in l]

【讨论】:

  • 使用 python 的 in 运算符的好建议,而不是把事情复杂化。
  • 这不允许我按文件类型清除;如果我这样做,我将不得不交换各种或。使用正则表达式可以让我轻松指定(即 (msi|exe|jpg) 等)
  • @nobody:没有人告诉你不要使用正则表达式,如果它是合适的工具。
  • @nobody,问题中没有任何内容表明您正在寻找文件扩展名。注意不要过滤名称中包含 msi 的文件
  • @nobody 如果您只寻找文件的扩展名,也许使用r".*\.(msi|exe||jgp)" 会更安全。
【解决方案2】:

由于您显然是在查看文件名列表,因此您也可以使用 endwith:

list = [l for l in list if l.endswith('.msi')]

【讨论】:

    【解决方案3】:

    这是一种按文件扩展名过滤列表的方法

    import os
    extensions = set(['.msi', '.jpg', '.exe'])
    L = [l for l in L if os.path.splitext(l)[1] not in extensions]
    

    【讨论】:

    • 或者,假设一个相当新的 Python 版本:extensions = {'.msi', '.jpg', '.exe'}
    • @Tim,设置字面量在 2.7 或更高版本
    • 我知道; 2.7 两天前刚刚庆祝了它的第一个生日,所以我认为这算“最近”,不是吗?
    • @Tim,当然,我只是觉得有时候有实际的版本号很方便
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2016-05-14
    • 2015-07-11
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多