Python Snakemake:在expand()中使用正则表达式

Python Snakemake:在expand()中使用正则表达式,python,regex,snakemake,Python,Regex,Snakemake,在使用expand函数时,我很难使用正则表达式。出于某种原因,通配符总是作为纯文本而不是执行的正则表达式导入。无论正则表达式是作为通配符引入还是与扩展函数结合引入,都没有区别(请参见all_decompress vs.all_decompress2)。错误总是: Missing input files for rule DECOMPRESS: Resources/raw/run1_lane1_read[1,2]_index\d+-\d+=[1-9], [11-32].fastq.gz - 如果

在使用expand函数时,我很难使用正则表达式。出于某种原因,通配符总是作为纯文本而不是执行的正则表达式导入。无论正则表达式是作为通配符引入还是与扩展函数结合引入,都没有区别(请参见all_decompress vs.all_decompress2)。错误总是:

Missing input files for rule DECOMPRESS:
Resources/raw/run1_lane1_read[1,2]_index\d+-\d+=[1-9], [11-32].fastq.gz
-


如果我是对的,Snakemake中的expand函数将生成一个字符串列表。此函数用于文件名,就像您使用它一样

我不知道expand函数是否可以与regex关联以创建列表

但是您可以用python生成这个列表,并将其交给规则all或expand函数

在您的情况下,可以使用以下代码获取并制作文件名列表:

import re
import os

path='.'
listoffiles=[]
for file in os.listdir(path):
  if(re.search('read[1-2]_index\d{3}-\d{3}=[1-9]',file)):
    listoffiles.append(os.path.splitext(file)[0])
然后,在列表文件中,您有所有文件名,您只需按如下方式使用扩展:

expand("{repertory}{filename}{extension},
       repertory = "Resources/decompressed/",
       filename = listoffiles,
       extension = ".fastq")
那么一切都应该完美运作


记住,在创建所有规则和DAG之前,蛇文件中的所有python代码都将在工作流开始时执行。所以它可以很强大。

我认为在expand中执行正则表达式可能是不可能的。然而,我找到了一个解决办法。对于其中两个通配符,我找到了不同的方法来描述它们(“读取”和“索引”),对于第三个通配符,我准备了一个函数并将其用作输入

#!/usr/bin/env python3

import re

###### WILDCARDS #####

## General descriptive parameters
read = (1,2)
index = list(range(1,9)) + list(range(11,32))

## Functions
def getDCinput(wildcards):
    read = wildcards.read
    index = wildcards.index
    path = wd + "Resources/raw/run1_lane1_read" + read + r"_index[0-9]??-[0-9]??=" + sample + ".fastq.gz"
    return(glob.glob(path))

##### RULES #####

### CONJUNCTION RULES ("all") ###
# PREANALYSIS #

rule all_decompress:
    input:
        expand("Resources/decompressed/read{read}_index{index}.fastq", read=read, index=index)

### TASK RULES ###
# FILE PREPARATION AND SMOOTHING #

# Decompress .gz zipped raw files
rule DECOMPRESS:
    input:
        getDCinput
    output:
        "Resources/decompressed/read{read}_index{index}.fastq"
    shell:
        "gzip -d -c {input} > {output}"

你查过bli的链接了吗

具体来说

下面是一个简单的示例,说明如何使用它生成png、pdf或两者:

rule all:
  input: expand("{graph}.png", graph=["dag", "rulegraph"])

rule dot_to_image:
    input: "{graph}.dot"
    output: "{graph}.{ext,(pdf|png)}"
    shell: "dot -T{wildcards.ext} -o {output} {input}"

希望这能有所帮助。

谢谢你的评论,平肖!您的方法肯定会获得正确的文件字符串,但是我相信我无法通过通配符访问它们。此外,所描述的问题或多或少是一个一般性问题,我希望避免为所有这些情况声明显式函数。一些可能有用的东西:
wildcard_constraints
()和
glob_wildcards
()可能我看得不够仔细,但在我看来,您似乎没有使用它就导入了re。
rule all:
  input: expand("{graph}.png", graph=["dag", "rulegraph"])

rule dot_to_image:
    input: "{graph}.dot"
    output: "{graph}.{ext,(pdf|png)}"
    shell: "dot -T{wildcards.ext} -o {output} {input}"