Python中使用glob模块能否匹配分组或可选分组的文件名?
问题解答
1. DigitalOcean测试工具和Python自带glob的规则差异
两者的规则存在明显差异。DigitalOcean的glob测试工具默认支持扩展glob语法(extglob),包含可选分组、多模式匹配等增强特性,而Python标准库的glob模块仅支持最基础的glob语法,不包含任何扩展语法支持。
2. Python glob是否支持圆括号可选分组
不支持。Python原生glob仅支持三类匹配规则:
*:匹配任意数量的非路径分隔符字符?:匹配单个非路径分隔符字符[]:匹配指定范围内的单个字符
你写法中的?(_Student[A-Z])在Python glob中会被识别为普通字符序列,需要文件名严格包含?、(、)这三个符号才能匹配,自然无法命中你的目标文件。
3. 替代解决方案
你可以根据需求选择两种方案:
方案1:多glob模式合并
如果规则简单,可以拆分出两个glob模式分别匹配两种场景,再合并结果:
# 匹配不带_Student后缀的文件 pattern1 = "MM05_submissions/MM05_*[a-z0-9].py" # 匹配带_Student后缀的文件 pattern2 = "MM05_submissions/MM05_*[a-z0-9]_Student[A-Z].py" # 合并结果去重 matched_files = set(current_path.glob(pattern1)) | set(current_path.glob(pattern2)) for file in matched_files: # 执行业务逻辑
方案2:使用正则表达式匹配
如果规则复杂,建议遍历目录后用正则匹配文件名,精准度更高:
import re from pathlib import Path # 定义匹配规则 file_pattern = re.compile(r"^MM05_.+[a-z0-9](_Student[A-Z])?\.py$") current_path = Path("./MM05_submissions") for file in current_path.iterdir(): if file.is_file() and file_pattern.match(file.name): # 执行业务逻辑
内容的提问来源于stack exchange,提问作者Dabeer Azeez
相关产品推荐
相关产品推荐

