首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我不能让这个正则表达式在snakemake中为wildcard_constraints工作

我不能让这个正则表达式在snakemake中为wildcard_constraints工作
EN

Stack Overflow用户
提问于 2017-10-21 04:14:58
回答 2查看 1.1K关注 0票数 1

我有一个用Snakemake编写的工作流,用于分析生物测序数据。工作流程要求组织所有数据文件,以便每个原始读取文件都以分析类型(RNASeq、DNaseSeq等)开头。并且此文件名约定在工作流生成的所有文件中都保持不变。

我有一个规则来对齐除RNASeq之外的每个分析的数据读数,还有一个仅应用于RNASeq数据的不同规则。我在设置这些规则时遇到了麻烦,这样snakemake才能知道对哪些文件使用哪些规则。

在RNASeq规则中,我有以下内容:

代码语言:javascript
运行
复制
wildcard_constraints: library='RNASeq_.+'

这将确保RNASeq库使用该规则。但是,我仍然收到关于其他分析的模糊规则的错误,所以我认为我需要约束其他规则中的通配符。我试过了:

代码语言:javascript
运行
复制
wildcard_constraints: library='(!?RNASeq)_.+'

匹配任何没有RNASeq的内容,但是如果我在python解释器中尝试它,snakemake似乎无法与这个正则表达式匹配任何内容。我尝试过其他方法,例如“^R^A”,但无法正常工作。

由于这些正则表达式在我手动对字符串进行尝试时会起作用,我认为要么是snakemake应用正则表达式的方式有问题,要么是我不了解snakemake是如何使用它们的。我假设它只是“如果这个正则表达式匹配通配符字符串,就使用这个规则。如果不匹配,就不要使用这个规则。”

EN

回答 2

Stack Overflow用户

发布于 2018-02-16 16:16:02

我相信以下内容说明了您正在尝试实现的目标:

代码语言:javascript
运行
复制
# Snakefile

rule sam_startswith_dna:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='dna.+'
    shell: 'touch {output}'

rule sam_not_startswith_dna:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='(?!dna).+'  # negative lookahead assertion
    shell: 'touch {output}'

rule bam_endswith_rna:
    output: '{pattern}.bam'
    wildcard_constraints: pattern='.+rna'
    shell: 'touch {output}'

rule bam_not_endswith_rna:
    output: '{pattern}.bam'
    wildcard_constraints: pattern='.+(?<!rna)'  # negative lookbehind assertion
    shell: 'touch {output}'

使用它(snakemake 4.6.0,python 3.6):

代码语言:javascript
运行
复制
$ snakemake -n dna_sample.sam   # runs rule: sam_startswith_sam

$ snakemake -n sample.sam       # runs rule: sam_not_startswith_sam
$ snakemake -n sample_dna.sam   # runs rule: sam_not_startswith_sam

$ snakeamke -n sample_rna.bam   # runs rule: bam_endswith_rna

$ snakemake -n sample.bam       # runs rule: bam_not_endswith_rna
$ snakemake -n rna_sample.bam   # runs rule: bam_not_endswith_rna

这是我认为你在做的事情:

代码语言:javascript
运行
复制
# Snakefile2

rule sam_startswith_dna_:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='dna_.+'
    shell: 'touch {output}'

rule sam_not_startswith_dna_:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='(?!dna)_.+'
    shell: 'touch {output}'

使用它:

代码语言:javascript
运行
复制
$ snakemake -s Snakefile2 dna_data.sam  # runs rule: sam_startswith_dna_

$ snakemake -s Snakefile2 rna_data.sam  # raises MissingRuleException :( :( :(

下面是你本可以修复它的方法:

代码语言:javascript
运行
复制
# Snakefile3

rule sam_startswith_dna_:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='dna_.+'
    shell: 'touch {output}'

rule sam_not_startswith_dna_:
    output: '{pattern}.sam'
    wildcard_constraints: pattern='(?!dna)[^_]{3}_.+'
    shell: 'touch {output}'

使用它:

代码语言:javascript
运行
复制
$ snakemake -s Snakefile3 -n dna_data.sam  # runs rule: sam_startswith_dna_

$ snakemake -s Snakefile3 -n rna_data.sam  # runs rule: sam_not_startswith_dna_

由于硬编码的{3},所以它不是很通用

代码语言:javascript
运行
复制
$ snakemake -s Snakefile3 -n gdna_data.sam  # raises MissingRuleException

下面是基于我对snakemake.io.regex的简要阅读和一些探索;可能包含错误

通常,给定如下规则:

代码语言:javascript
运行
复制
rule some_rule:
    output: 'some.{pattern}.txt'
    wildcard_constraints: pattern='[a-z_]+'
    shell: 'touch {output}'

以及如下所示的命令行调用:

代码语言:javascript
运行
复制
$ snakemake some.tar_get.txt

如果满足以下条件,将执行规则some_rule

代码语言:javascript
运行
复制
re.search('some\.(?P<pattern>[a-z_]+)\.txt$', 'some.tar_get.txt')

返回匹配(假设其他检查通过(例如模糊性、循环dag等))。

有趣的是,$被附加到模式中,但^没有被附加在模式前面。

这种行为与我最初认为的不同,我最初的想法是这样的(这将允许在wildcard_constraints中使用^$ ):

代码语言:javascript
运行
复制
# python3, pseudo-code-ish

output = 'some.{pattern}.txt'
pattern = '[a-z_]+'

target = 'some.tar_get.txt'

# First test: does the target file name match the output (without the constraint)?
m = re.search('some\.(?P<pattern>.+)\.txt', target)
if not m:
    raise MissingInputException

# Second test: does the wildcard satisfy user-supplied constraint?
m = re.search(pattern, m.group('pattern'))
if not m:
    raise MissingInputException

run_rule()
票数 4
EN

Stack Overflow用户

发布于 2017-10-21 04:19:10

如果您不希望代码行以RNASeq或DNaseSeq开头,您可以这样做

代码语言:javascript
运行
复制
r'^(?!RNASeq)(?!DNaseSeq).+'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46856698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档