如何在定义glob_wildcards时排除隐藏文件(多输入场景)
用Snakemake通配符排除隐藏文件/文件夹
我正在用Snakemake的glob_wildcards定义输入目录的通配符,当前代码如下:
files = glob_wildcards("input/{organism}/{gene}/{sequence}.txt")
但input目录中存在以.或._开头的隐藏文件/子文件夹,希望在定义通配符时直接排除它们。
我尝试用正则表达式匹配不以.开头的内容来约束通配符,却得到了空的通配符结果:
files = glob_wildcards("input/{organism,[^.]+}/{gene,[^.]+}/{sequence,[^.]+}.txt") # 输出结果 files: Wildcards(organism=[], gene=[], sequence=[])
补充说明
未使用正则约束时的示例输出:
files: Wildcards(organism=['organism', 'organism'], gene=['gene', 'gene'], sequence=['._gene-pseudo_V:123..456__organism__gene', 'gene-pseudo_V:123..456__organism__gene']
问题原因
你用的正则[^.]+要求匹配完全不包含.的字符串,但你的有效文件名(比如示例中的gene-pseudo_V:123..456__organism__gene)里包含.,所以这个正则会把有效文件也排除,导致结果为空。你真正需要的是匹配不以.开头的字符串,而非完全不含.的字符串。
解决方案
修改正则约束,使用[^.].*来匹配「第一个字符不是.,后续可以是任意字符(包括.)」的内容:
files = glob_wildcards("input/{organism,[^.].*}/{gene,[^.].*}/{sequence,[^.].*}.txt")
这个正则会:
- 排除所有以
.开头的organism子文件夹 - 排除所有以
.开头的gene子文件夹 - 排除所有以
.开头的sequence文件名(包括._开头的)
如果需要确保通配符内容不为空,可以把.*改成.+,即[^.].+,这样要求至少有两个字符(第一个非.,后面至少一个字符)。
内容的提问来源于stack exchange,提问作者amk
相关产品推荐
相关产品推荐

