Snakemake中glob_wildcards与wildcard_constraints使用问题求助
问题描述
在Snakemake流程中提取RNA-seq测序文件的通配符时出现匹配错误,具体细节如下:
文件示例
- Mus_musculus数据集(PRJNA362883_GSE93946_SRP097621):
SRR5195524_GSM2465521_KrasT_45649_NoDox_Mus_musculus_RNA-Seq_1.fastq.gz - Homo_sapiens数据集(PRJNA493818_GSE120639_SRP162872):
SRR7942395_GSM3406786_sAML_Control_1_Homo_sapiens_RNA-Seq_1.fastq.gz
期望通配符输出
- 数据集:
['PRJNA362883_GSE93946_SRP097621', ...] - 样本:
['SRR5195524_GSM2465521_KrasT_45649_NoDox', ...] - 物种:
['Mus_musculus', ...] - 测序读段编号:
['1', ...]
尝试的代码及问题
使用以下代码尝试匹配:
import glob import os DATASET,SAMPLE,SPECIES,FRR = glob_wildcards(config["project_path"]+"resources/raw_datasets/{dataset}/{sample}_{species}_RNA-Seq_{frr}.fastq.gz") print(DATASET,SAMPLE,SPECIES,FRR)
由于文件名包含多个下划线,导致样本通配符错误包含物种前缀,物种通配符仅提取到后半部分。尝试设置wildcard_constraints: species = '!(_sapiens_)'未解决问题。
解决方案
核心是利用wildcard_constraints给物种通配符指定精准的正则匹配规则,消除下划线带来的匹配歧义。
正确代码实现
from snakemake.io import glob_wildcards # 定义通配符约束:限定物种只能是Mus_musculus或Homo_sapiens wildcard_constraints: species = "(Mus_musculus|Homo_sapiens)" # 匹配目标文件路径 DATASET, SAMPLE, SPECIES, FRR = glob_wildcards( config["project_path"] + "resources/raw_datasets/{dataset}/{sample}_{species}_RNA-Seq_{frr}.fastq.gz" ) print(DATASET, SAMPLE, SPECIES, FRR)
规则说明
- 通过
wildcard_constraints将species通配符限定为仅匹配Mus_musculus或Homo_sapiens,Snakemake会优先匹配这两个固定字符串,避免将样本部分的下划线误分割到物种通配符中。 - 此正则规则直接针对已知的两个物种做精确匹配,彻底解决了下划线导致的匹配错位问题。
内容的提问来源于stack exchange,提问作者manvenk
相关产品推荐
相关产品推荐

