Применение ограничений подстановочных знаков при расширении

#python #regex #wildcard #snakemake

Вопрос:

Я хочу собрать все файлы , соответствующие регулярному ^fs_noded .xyz$ выражению, но я не знаю, как написать расширение, чтобы глобус использовал ограничение. Прямо сейчас,

 wildcard_constraints:
    nodeidx = "d ",

rule all:
    input:
        expand("fs_node{i}.xyz",
               i=glob_wildcards("fs_node{nodeidx}.xyz").nodeidx)
 

выдает вывод , который также соответствует файлам, с irc которыми я не хочу:

     input: fs_node37_irc.xyz, fs_node41_irc.xyz, fs_node32.xyz, fs_node10.xyz, fs_node43.xyz, fs_node2.xyz, fs_node30_irc.xyz, fs_node16.xyz, fs_node45.xyz, fs_node23_irc.xyz, fs_node2_irc.xyz, fs_node44_irc.xyz, fs_node33_irc.xyz, fs_node35.xyz, fs_node1.xyz, fs_node28_irc.xyz, fs_node42.xyz, fs_node15_irc.xyz, fs_node12_irc.xyz, fs_node35_irc.xyz, fs_node42_irc.xyz, fs_node44.xyz, fs_node31.xyz, fs_node17_irc.xyz, fs_node8_irc.xyz, fs_node43_irc.xyz, fs_node15.xyz, fs_node5_irc.xyz, ...
 

Как правильно применять (глобальные) ограничения подстановочных знаков в расширениях? Это глобально, потому что также используется в других местах.

Комментарии:

1. Я только что увидел, что это все еще известная проблема: github.com/snakemake/snakemake/issues/482

2. Насколько я знаю, это ограничение glob_wildcards: github.com/snakemake/snakemake/issues/482

Ответ №1:

Возможно glob_wildcards , недостаточно гибок. Я бы явно перечислил все файлы, выбрал те, которые вы хотите сохранить с помощью некоторого регулярного выражения, извлек переменную часть nodeidx и использовал ее в качестве подстановочного знака. Не проверено:

 import os
import re

listdir = os.listdir(os.getcwd())

nodeidx = []
for x in listdir:
    if re.match('^fs_noded .xyz


Комментарии:

1. Этот подход я тоже использую.

2. Мне нужно было это сделать _ = int(idx) , так как одним из совпадений является число ноль, что является желаемым поведением. Но это работает.

3. @pentavalentcarbon хорошее замечание о числе ноль!

4. @dariober Конечно, я хотел внести правку, но предложенная очередь правок заполнена?!

, x):
idx = re.sub('^fs_node', '', re.sub('.xyz

Комментарии:

1. Этот подход я тоже использую.

2. Мне нужно было это сделать _ = int(idx) , так как одним из совпадений является число ноль, что является желаемым поведением. Но это работает.

3. @pentavalentcarbon хорошее замечание о числе ноль!

4. @dariober Конечно, я хотел внести правку, но предложенная очередь правок заполнена?!

, '', x))
_ = int(idx) # sanity check
nodeidx.append(idx)

wildcard_constraints:
nodeidx = '|'.join([re.escape(x) for x in nodeidx])

rule all:
input:
expand("fs_node{nodeidx}.xyz", nodeidx= nodeidx)

Комментарии:

1. Этот подход я тоже использую.

2. Мне нужно было это сделать _ = int(idx) , так как одним из совпадений является число ноль, что является желаемым поведением. Но это работает.

3. @pentavalentcarbon хорошее замечание о числе ноль!

4. @dariober Конечно, я хотел внести правку, но предложенная очередь правок заполнена?!