Python中基于多扩展名模式筛选文件:正则表达式实现方案
解决通配符扩展名匹配问题:用正则替换
endswith() 你说得对,str.endswith()确实只能处理固定的后缀字符串,完全搞不定带*的通配符规则。咱们可以把这些通配符规则转换成正则表达式,就能完美匹配所有你需要的模式了。
先分析每个规则的匹配意图
先拆解你的extList里每个规则要匹配的文件:
*pdf:匹配文件名以pdf结尾的文件(比如report.pdf、invoicepdf)*.cod:匹配文件名以.cod结尾的文件(比如data.cod)*log*:匹配**文件名任意位置包含log**的文件(比如error.log、logfile.txt、app_log.csv)*.log.*:匹配文件名包含.log.子串的文件(比如output.log.txt、debug.log.csv)
通配符转正则的方法
把每个通配符规则转换成正则表达式,需要做这几步:
- 用
re.escape()转义规则里的特殊字符(比如.,正则里它代表任意字符,我们要让它只匹配字面量的点) - 把通配符
*替换成正则的.*(表示匹配0个或多个任意字符) - 对
*pdf、*.cod这种"后缀匹配"的规则,加上$锚点,确保只匹配文件名结尾,避免误判
完整代码实现
import os import re extList = ["*pdf","*.cod","*log*","*.log.*"] def wildcard_to_regex(pattern): # 转义正则特殊字符,再替换通配符*为正则的.* escaped_pattern = re.escape(pattern) regex_pattern = escaped_pattern.replace(r'\*', '.*') # 对仅后缀匹配的规则(开头是*,后面没有其他*),添加结尾锚点$ if pattern.startswith('*') and '*' not in pattern[1:]: regex_pattern += '$' return regex_pattern # 生成所有规则的正则表达式,然后组合成一个匹配模式 regex_rules = [wildcard_to_regex(p) for p in extList] combined_regex = re.compile('|'.join(regex_rules)) # 替换你原来的代码片段 path = "/path/to/your/file" # 替换成实际路径 if os.path.isfile(path): # 提取文件名,避免路径中的目录名干扰匹配 filename = os.path.basename(path) if combined_regex.fullmatch(filename): print("match")
代码说明
wildcard_to_regex():负责把每个通配符规则转换成对应的正则表达式,处理了特殊字符转义和锚点添加combined_regex:把所有规则合并成一个正则,用|分隔,表示"匹配任意一个规则即可"- 使用
os.path.basename(path):只匹配文件名本身,不会因为路径里的目录名(比如/log_dir/test.txt)误触发*log*规则
测试用例
这些文件会被匹配:
annual_report.pdf→ 匹配*pdfconfig.cod→ 匹配*.codsystem.log→ 匹配*log*app.debug.log.csv→ 匹配*.log.*
这些文件不会被匹配:
pdf_notes.txt→ 结尾不是pdfcod_file.txt→ 结尾不是.codreadme.txt→ 不包含logerrorlog.txt→ 不包含.log.子串
内容的提问来源于stack exchange,提问作者Yogendra Sharma
相关产品推荐
相关产品推荐

