三引号Shell规则中转义句点的Snakemake语法警告求助
解决Snakemake中Shell代码块的SyntaxWarning(无效转义序列.)问题
问题说明
在Snakemake规则中使用指定Shell代码块时,收到如下警告:
SyntaxWarning: invalid escape sequence '\.'
警告指向另一个不含句点的规则行号,但注释该规则无法解决问题;注释包含上述Shell块的规则后警告消失。当前Shell代码功能正常,但需调整格式消除警告。涉及的Shell代码如下:
""" curl {params.ua} -L {params.url} \ | gzip -dc \ | sd '^.*gene_id "([A-Z0-9\.]+).*"; transcript_id "([A-Z0-9\.]+)".*;.*' '$2\t$1' \ | uniq | gzip > {output} """
原因分析
Snakemake依赖Python解析规则中的字符串,你使用的三重双引号字符串里的\.是Python不识别的转义序列(Python中\.不属于合法转义,而Shell正则需要它匹配字面量句点),因此触发SyntaxWarning。警告行号偏移是Python解析时的偶发问题,实际根源在这段Shell代码。
修复方案
方案1:使用原始字符串(推荐)
在三重引号前添加r前缀,将字符串标记为原始字符串,让Python不解析内部的转义序列,直接原样传递给Shell执行。修改后的代码:
r""" curl {params.ua} -L {params.url} \ | gzip -dc \ | sd '^.*gene_id "([A-Z0-9\.]+).*"; transcript_id "([A-Z0-9\.]+)".*;.*' '$2\t$1' \ | uniq | gzip > {output} """
方案2:双转义句点
如果不想用原始字符串,可将\.替换为\\.,让Python解析后输出单个\.给Shell:
""" curl {params.ua} -L {params.url} \ | gzip -dc \ | sd '^.*gene_id "([A-Z0-9\\.]+).*"; transcript_id "([A-Z0-9\\.]+)".*;.*' '$2\t$1' \ | uniq | gzip > {output} """
内容的提问来源于stack exchange,提问作者Jamie Matthews
相关产品推荐
相关产品推荐

