如何用正则表达式筛选repo/bob/ebb下特定目录的XML文件
筛选符合特定目录规则的XML文件
嘿,我来帮你搞定这个XML文件筛选的问题!从你的需求来看,你需要从repo/bob/ebb目录下的所有XML文件里,精准找出符合两种目录结构的文件,对吧?下面我给你两种常用的实现方式,你可以根据自己的使用场景来选:
方式一:用命令行(Find命令)
如果你习惯用终端操作,find命令是绝佳选择,它能递归遍历目录并匹配规则:
场景1:短横线代表单个任意字符
比如bb--表示bb后面跟2个任意字符的目录,dl-----------表示dl后面跟11个任意字符的目录,那命令可以这么写:
find repo/bob/ebb -path "repo/bob/ebb/bb??/nr/dl???????????/*.xml" -o -path "repo/bob/ebb/bb????/nr/dl???????????/*.xml"
解释一下:
-path用来匹配完整的文件路径??匹配任意2个单个字符,????匹配任意4个,以此类推-o表示“或”的逻辑,同时匹配两种目录规则- 如果要递归包含子目录里的所有XML,把
*.xml改成**/*.xml(部分shell需要开启globstar选项,比如bash里执行shopt -s globstar)
场景2:短横线代表任意长度的任意字符
如果bb--是指bb开头的任意目录(不管后面有多少字符),dl-----------是dl开头的任意目录,那命令可以简化成:
find repo/bob/ebb -path "repo/bob/ebb/bb*/nr/dl*/**/*.xml"
这里的*会匹配任意长度的字符序列(包括空字符),**用来递归匹配所有子目录。
方式二:用Python代码处理
如果你的XML文件列表已经是数组形式(比如在Python里处理),可以用正则表达式或者glob模块来筛选:
用正则表达式
先定义匹配路径的正则规则,然后遍历数组过滤:
import re # 假设你的XML文件路径数组是xml_files xml_files = ["repo/bob/ebb/bbab/nr/dl12345678901/file1.xml", ...] # 正则规则:匹配两种目录结构,短横线代表单个任意字符的情况 pattern = r'repo/bob/ebb/bb.{2}/nr/dl.{11}/.*\.xml$' # 如果是任意长度字符,改成:r'repo/bob/ebb/bb.+/nr/dl.+/.*\.xml$' filtered_files = [file for file in xml_files if re.match(pattern, file)] # 输出结果 for file in filtered_files: print(file)
解释:
.{2}匹配任意2个字符,对应bb--的两个短横线.{11}匹配任意11个字符,对应dl-----------的11个短横线- 如果是任意长度,用
.+(匹配至少一个任意字符)或者.*(匹配0个或多个)
用glob模块直接查找文件
如果你还没获取文件数组,直接用glob来遍历目录:
import glob # 单个字符匹配的情况 files1 = glob.glob('repo/bob/ebb/bb??/nr/dl???????????/**/*.xml', recursive=True) files2 = glob.glob('repo/bob/ebb/bb????/nr/dl???????????/**/*.xml', recursive=True) filtered_files = files1 + files2 # 任意长度字符的情况 filtered_files = glob.glob('repo/bob/ebb/bb*/nr/dl*/**/*.xml', recursive=True)
recursive=True会开启递归遍历子目录,正好符合你“递归包含该目录下所有XML文件”的需求。
小提示
如果不确定目录名的匹配规则,可以先手动列几个符合条件的路径,测试一下正则或者glob模式是否能命中,这样能避免遗漏或者误匹配哦!
内容的提问来源于stack exchange,提问作者Ammar Ahmad
相关产品推荐
相关产品推荐

