【问题标题】:Can I match groups / optional groups using glob in Python?我可以在 Python 中使用 glob 匹配组/可选组吗?
【发布时间】:2021-08-21 17:04:49
【问题描述】:

我希望能够使用 Python 3.9 中的 glob 模块来匹配包含以下文件名的目录中的文件名:

  • “MM05_awani3_StudentA.py”
  • “MM05_liu127.py”

具体来说,我希望能够遍历目录中符合特定模式的所有文件。所以我想使用这样的for循环:

for file in current_path.glob("string"):
    # do something

glob 模式 "MM05_submissions/MM05_*[a-z0-9]?(_Student[A-Z]).py" 似乎根据 DigitalOcean's glob tester tool 工作,但我没有得到Python 3.9 内的任何匹配项

  • DigitalOcean 的测试仪上使用的 glob 是否与 Python 中的不同?
  • 能否在 Python 中使用圆括号 () 匹配可选组?
  • 如果不是,我是否应该使用 RegEx 之类的方法来遍历与目录中特定模式匹配的文件?

【问题讨论】:

  • Python 的glob() 函数并没有那么复杂。详见fnmatch module:不支持(...)分组。

标签: python glob


【解决方案1】:

你不能使用(...) 分组,不。 glob()模块使用fnmatch module进行匹配,它支持*?[seq][!seq],仅此而已。

但是,fnmatch 使用简单的模式到正则表达式转换来测试文件名。用os.scandir()自己做同样的事情:

import re
import os

pattern = re.compile("MM05_[a-z0-9]*(_Student[A-Z])?\.py")

for entry in os.scandir("MM05_submissions"):
    if pattern.fullmatch(entry.name):
        # name matched the pattern

如果您需要使用目录名称支持任意深度模式,则必须使用 os.walk() 编写一些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多