Python 在扩展中强制使用通配符约束

Python 在扩展中强制使用通配符约束,python,regex,wildcard,snakemake,Python,Regex,Wildcard,Snakemake,我想收集与regex^fs\u node\d+\.xyz$匹配的所有文件,但我不知道如何编写扩展以便glob使用约束。现在, wildcard_constraints: nodeidx = "\d+", rule all: input: expand("fs_node{i}.xyz", i=glob_wildcards("fs_node{nodeidx}.xyz").nod

我想收集与regex
^fs\u node\d+\.xyz$
匹配的所有文件,但我不知道如何编写扩展以便glob使用约束。现在,

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, ...

如何在扩展中正确实施(全局)通配符约束?它是全局性的,因为它也可以在其他位置使用。

可能
全局通配符
不够灵活。我会显式地列出所有文件,选择那些您希望保留在某些正则表达式中的文件,提取变量部分
nodeidx
,并将其用作通配符。未测试:

import os
import re

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

nodeidx = []
for x in listdir:
    if re.match('^fs_node\d+\.xyz$', x):
        idx = re.sub('^fs_node', '', re.sub('\.xyz$', '', 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) 

我刚刚看到这仍然是一个已知的问题:据我所知,这是glob_通配符的一个限制:这也是我使用的方法。我需要执行
\uuu=int(idx)
,因为其中一个匹配是数字零,这是期望的行为。但是这是有效的,关于零这个数字,这是一个很好的观点@dariober我当然想编辑,但建议的编辑队列已满?!