带排除项和正则表达式的文件遍历

File walk with exclusions and regex

import os

root = "C:\temp\a"
exclude = set(["New folder"])


for current, dirs, files in os.walk(root):
  dirs[:] = [d for d in dirs if d not in exclude]
  for f in files:
    print f

如何确保我也排除 "New folder" 的大小写和白色 space 变体 即

exclude = set([
 "New folder",
 "New Folder",
 "new folder",
 "new Folder",
 "newfolder"
 ])

无需计算出所有可能的变体作为排除集的一部分?这可以插入正则表达式吗?

Python 在 re module 中实现了功能齐全的正则表达式。您可以预编译正则表达式并将其与每个目录名称匹配:

import os, re

root = "C:\temp\a"
exclude = re.compile('^new\s*folder$', re.IGNORECASE)

for current, dirs, files in os.walk(root):
  dirs[:] = [d for d in dirs if exclude.match(d) is not None]
  for f in files:
    print f

正则表达式已被预编译,因为您多次使用它。它具有以下组件:

  • ^$分别表示字符串的开头和结尾。这是避免部分匹配所必需的,例如 a new folder!.
  • \s* 表示任何类型的零个或多个 space。如果您想严格检查 space 个字符,可以将其替换为 *
  • 标志 e.IGNORECASE 使比较不区分大小写,因此它匹配您的所有原始可能性。作为副作用,这也会匹配 NeWfOlDeR.
  • 之类的东西