#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 Конечно, я хотел внести правку, но предложенная очередь правок заполнена?!