无法使此正则表达式适用于snakem中的通配符\u约束

2024-05-13 09:00:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用Snakemake编写的分析生物测序数据的工作流程。工作流期望所有的数据文件都被组织起来,以便每个原始读取文件都以分析类型(RNASeq、dnaseq等)开始,并且在工作流生成的所有文件中都保持这种文件名约定。在

我有一个规则来对齐除了RNASeq之外的每个分析的数据读取,还有一个只应用于RNASeq数据的不同规则。我在设置这些规则时遇到了困难,以便snakemake知道哪些文件要使用哪个。在

在RNASeq规则中,我有这样一个:

wildcard_constraints: library='RNASeq_.+'

这可以确保RNASeq库使用该规则。但是,对于其他分析的不明确规则,我仍然得到一个错误,因此我认为我需要约束其他规则中的通配符。我试过了:

^{pr2}$

要说匹配没有RNASeq的任何内容,但是如果我在python解释器中尝试它,snakemake似乎无法将任何内容与这个regex匹配。我也试过其他方法,比如“[^R][^N][^A]”,但什么都没用。在

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


Tags: 文件数据字符串类型内容文件名规则数据文件
2条回答

如果您不想让您的行以RNASeq或DNaseSeq开头,可以这样做

r'^(?!RNASeq)(?!DNaseSeq).+'

我相信以下是你想要达到的目标:

# 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):

^{pr2}$

我觉得你在做什么:

^{3}$

使用它:

$ snakemake -s Snakefile2 dna_data.sam  # runs rule: sam_startswith_dna_

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

以下是如何修复它:

# 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}'

使用它:

$ 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},它不是很通用:

$ snakemake -s Snakefile3 -n gdna_data.sam  # raises MissingRuleException

以下内容是基于我对snakemake.io.regex的简要阅读,可能包含错误

一般来说,给出这样的规则:

rule some_rule:
    output: 'some.{pattern}.txt'
    wildcard_constraints: pattern='[a-z_]+'
    shell: 'touch {output}'

以及这样的命令行调用:

$ snakemake some.tar_get.txt

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

re.search('some\.(?P<pattern>[a-z_]+)\.txt$', 'some.tar_get.txt')

返回匹配项(假设其他检查通过(例如歧义、循环dag等))。在

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

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

# 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()

相关问题 更多 >