当前位置: 首页 > 知识库问答 >
问题:

在闭包中重命名.FromFilePairs并使用regex捕获组

漆雕兴平
2023-03-14

我是NextFlow/Groovy/Java的新手,在处理一个简单的正则表达式任务时遇到了一些困难。

我正在尝试修改一些文件对的标签。我的理解是,fromFilePairs返回的数据结构形式如下:

[
    [common_prefix, [file1, file2]],
    [common_prefix, [file3, file4]]
]

我进一步认为:

  • 对此列表中的项调用.name方法时,将给出名称,我在上面将其标记为common_prefix
  • fromfilepairs一起使用的闭包返回的值设置文件对的名称。
  • fromfilepairs一起使用的闭包中的it的值是文件对列表中的单个项。

但是,我在以下几个方面尝试了很多变体都没有成功:

params.fastq = "$baseDir/data/fastqs/*_{1,2}_*.fq.gz"

Channel
    .fromFilePairs(params.fastq, checkIfExists:true) {
        file -> 
            // println file.name // returned the common file prefix as I expected
            mt = file.name =~ /(common)_(prefix)/
            // println mt 
            // # java.util.regex.Matcher[pattern=(common)_(prefix) region=0,47 lastmatch=]
            // match objects appear empty despite testing with regexs I know to work correctly including simple stuff like (.*) to rule out issues with my regex
            // println mt.group(0) // #No match found
            mt.group(0) // or a composition like mt.group(0) + "-" + mt.group(1)
    }
    .view()

我还尝试了使用replaceAll方法的一些变体。

我已经查阅了nextflow,groovy和Java的文档,但我仍然不知道我缺少了什么。我认为这是一些愚蠢的语法问题,或者是对数据结构的误解,但我已经厌倦了对它大加指责,当它对更懂这种语言的人来说很明显的时候--我非常感谢任何能够启发我如何工作的人。

共有1个答案

胥宏义
2023-03-14

可以向fromfilepairs运算符提供闭包来实现自定义文件对分组策略。它接受一个文件并应该返回分组键。文档中的示例只是按文件扩展名对文件进行分组:

Channel
    .fromFilePairs('/some/data/*', size: -1) { file -> file.extension }
    .view { ext, files -> "Files with the extension $ext are $files" }

如果您想要做的只是更改一些文件对的标签,那么这是不必要的。您可以为此使用map运算符。fromFilePairs操作发出元组,其中第一个元素是匹配对的“分组键”,第二个元素是“文件列表”(按词典排序):

Channel
    .fromFilePairs(params.fastq, checkIfExists:true) \
    .map { group_key, files ->

        tuple( group_key.replaceAll(/common_prefix/, ""), files )
    } \
    .view()
 类似资料:
  • 闭包本身是相当灵活的,可以实现所需功能来让闭包运行而不用类型标注(原文:Closures are inherently flexible and will do what the functionality requires to make the closure work without annotation)。这允许变量捕获灵活地适应使用 情况,有时是移动(moving)有时是借用(borro

  • null 我得到以下错误: 为什么会这样?

  • 此regex:使用多个组匹配表达式。regex的要点是它捕获两个成对的模式,其中regex的第一部分必须跟在regex的第二部分后面。 如何提取这两个组中的每一个? 这里的关键是regex匹配两次,每次包含2个组。我希望每个匹配都有一个它自己的列表,这个列表包含2个元素,每个组一个。

  • 我正在试图理解这个代码块。在第一个中,我们在表达式中寻找的是什么? 我的理解是,它是任何一个字符(0或多个*),后面跟0到9之间的任何一个数字(一个或多个+),后面跟任何一个字符(0或多个*)。 执行此操作时,结果为: 使用抓取群的好处是什么?

  • 我很难匹配和捕捉这些。目前我正在尝试以下变体: 我认为sed有一些regex或捕获组行为我不理解