You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

通配符转正则的方法

把每个通配符规则转换成正则表达式,需要做这几步:

  1. 用re.escape()转义规则里的特殊字符(比如.,正则里它代表任意字符,我们要让它只匹配字面量的点)
  2. 把通配符*替换成正则的.*(表示匹配0个或多个任意字符)
  3. 对*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 → 匹配*pdf
  • config.cod → 匹配*.cod
  • system.log → 匹配*log*
  • app.debug.log.csv → 匹配*.log.*

这些文件不会被匹配:

  • pdf_notes.txt → 结尾不是pdf
  • cod_file.txt → 结尾不是.cod
  • readme.txt → 不包含log
  • errorlog.txt → 不包含.log.子串

内容的提问来源于stack exchange,提问作者Yogendra Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:54