正则表达式:列出用python构建示例代码的所有可能性

正则表达式:列出用python构建示例代码的所有可能性,python,regex,bioinformatics,Python,Regex,Bioinformatics,我正在尝试编写一些代码,可以列出给定reg ex表达式的可能性。请注意,此表达式稍有不同,每个字母代表一种蛋白质,因此其有限,例如: [IG]...D.SG pos = [['det'], ['noun', 'adj'], ['noun'], ['vb'], ['det'], ['vb', 'noun', 'adj']] for x in itertools.product(*pos): print " ".join(x) 这基本上意味着如果我列出所有的可能性,我会得到这样的结

我正在尝试编写一些代码,可以列出给定reg ex表达式的可能性。请注意,此表达式稍有不同,每个字母代表一种蛋白质,因此其有限,例如:

[IG]...D.SG
pos = [['det'], ['noun', 'adj'], ['noun'],
       ['vb'], ['det'], ['vb', 'noun', 'adj']]
for x in itertools.product(*pos):
print " ".join(x)
这基本上意味着如果我列出所有的可能性,我会得到这样的结果:第一个字母可以是I或G,第二个字母可以是20个蛋白质字母中的任意一个,第三个神智正常可以是20个字母中的任意一个,第五个可以是20个字母中的任意一个,第六个必须是D,第七个可以是20个字母中的任意一个,最后两个固定为SG

我知道通过使用itertools.product,我可以做类似的事情,例如:

[IG]...D.SG
pos = [['det'], ['noun', 'adj'], ['noun'],
       ['vb'], ['det'], ['vb', 'noun', 'adj']]
for x in itertools.product(*pos):
print " ".join(x)
印刷品

det noun noun vb det vb
det noun noun vb det noun
det noun noun vb det adj
det adj noun vb det vb
det adj noun vb det noun
det adj noun vb det adj
摘自: 我怎样才能把它推广到我的问题上?谢谢你的帮助

itertools.product是这里的发展方向。如果您的蛋白质都是单个字符,那么对于正则表达式中的每个位置,只需将表示该位置的有效蛋白质的字符串放入itertools.product参数中即可

例如,[IG]…D.SG将变成以下内容:

p = 'ABCDEFGHIJKLMNOPQRST'   # or whatever the 20 valid proteins are
itr = itertools.product('IG', p, p, p, 'D', p, 'S', 'G')
至于使用任意正则表达式并生成itertools.product的参数,如果您需要重复之类的支持,如果您只允许字符类和单个字符,则可能会很快变得复杂,然后您可以执行以下操作:

s = '[IG]...D.SG'
args = [p if m == '.' else m.strip('[]') for m in re.findall(r'(\[.+?\]|.)', s)]
# args == ['IG', 'ABCDEFGHIJKLMNOPQRST', 'ABCDEFGHIJKLMNOPQRST', 'ABCDEFGHIJKLMNOPQRST', 'D', 'ABCDEFGHIJKLMNOPQRST', 'S', 'G']
itr = itertools.product(*args)
itertools.product是这里的发展方向。如果您的蛋白质都是单个字符,那么对于正则表达式中的每个位置,只需将表示该位置的有效蛋白质的字符串放入itertools.product参数中即可

例如,[IG]…D.SG将变成以下内容:

p = 'ABCDEFGHIJKLMNOPQRST'   # or whatever the 20 valid proteins are
itr = itertools.product('IG', p, p, p, 'D', p, 'S', 'G')
至于使用任意正则表达式并生成itertools.product的参数,如果您需要重复之类的支持,如果您只允许字符类和单个字符,则可能会很快变得复杂,然后您可以执行以下操作:

s = '[IG]...D.SG'
args = [p if m == '.' else m.strip('[]') for m in re.findall(r'(\[.+?\]|.)', s)]
# args == ['IG', 'ABCDEFGHIJKLMNOPQRST', 'ABCDEFGHIJKLMNOPQRST', 'ABCDEFGHIJKLMNOPQRST', 'D', 'ABCDEFGHIJKLMNOPQRST', 'S', 'G']
itr = itertools.product(*args)
要根据您的评论生成所需的示例数据,您不应该生成完整的可能性集合!既然你说的是蛋白质这个词,那么计算一下一次真正的测试有多少可能性,需要多少磁盘空间,你就会明白为什么这不是一个好的开始

RE Include yours描述了一个有限状态自动机,我认为将您的状态自动机转换为一种可以随机遍历以生成数据的形式是有意义的。如果您的REs只有字符范围和通配符,那么它将非常简单,因为没有循环:将“[IG]…D.SG”转换为表单中的列表

[ 'IG', '.', '.', '.', 'D', '.', 'S', 'G' ]
然后遍历列表,使用random.choice从每个步骤的选项中随机选择一个字母,或者从整个字母表中选择一个字母(如果该字母是空的)。或者不转换它,只是按原样遍历它。但是转换将问题分为两个简单的部分。

要根据您的评论生成所需的样本数据,您不应该生成完整的可能性集合!既然你说的是蛋白质这个词,那么计算一下一次真正的测试有多少可能性,需要多少磁盘空间,你就会明白为什么这不是一个好的开始

RE Include yours描述了一个有限状态自动机,我认为将您的状态自动机转换为一种可以随机遍历以生成数据的形式是有意义的。如果您的REs只有字符范围和通配符,那么它将非常简单,因为没有循环:将“[IG]…D.SG”转换为表单中的列表

[ 'IG', '.', '.', '.', 'D', '.', 'S', 'G' ]

然后遍历列表,使用random.choice从每个步骤的选项中随机选择一个字母,或者从整个字母表中选择一个字母(如果该字母是空的)。或者不转换它,只是按原样遍历它。但是转换将问题分为两个简单的部分。

如果你在寻找一个通用解决方案,你可以检查代码。

如果你在寻找一个通用解决方案,你可以检查代码。

据我所知,你想输入一个模式,如

[IG]…D.SG

并且能够生成可能组合的完整列表

基于您已经提供的内容和回答,我认为以下内容应该能够满足您的要求

import itertools

def main():
    proteins = ['A','B','C','D','E','F','G','H','I',]
    prot_seq = [['I','G',],proteins,proteins,proteins,['D',],proteins,['S',],['G'],]
    fn = open('try.txt','w')
    for x in itertools.product(*prot_seq):
        value = ''.join(x)
        fn.write(value)
        fn.write('\n')
    fn.close()

if __name__=='__main__':
    main()
请注意,我们已将您的序列指定为列表

prot_seq = [['I','G',],proteins,proteins,proteins,['D',],proteins,['S',],['G'],]
如果您不想显式地将prot_seq指定为python列表,而是希望能够在给定RE-like字符串的情况下计算所有可能性

[IG]…D.SG

然后,您可以编写一个基本的解析器,将字符串表达式转换为等效的列表表达式。这个程序正是这样做的。两者的输出完全相同

import itertools
proteins = ['A','B','C','D','E','F','G','H','I',]   #Make this list as long as you want

def convert_to_seq(prot_seq_str):
    global proteins
    prot_seq = []
    for char in prot_seq_str:
        if char == '[':
            new_seq = []
            in_group = 1
        elif char == ']':
            in_group = 0
            prot_seq.append(new_seq)
        elif char == '.':
            prot_seq.append(proteins)
        else:
            if in_group == 1:
                new_seq.append(char)
            else:
                prot_seq.append(char)
    return prot_seq


def main():    
    prot_seq_str = '[IG]...D.SG'
    prot_seq = convert_to_seq(prot_seq_str)
    fn = open('try2.txt','w')
    for x in itertools.product(*prot_seq):
        value = ''.join(x)
        fn.write(value)
        fn.write('\n')
    fn.close()

if __name__=='__main__':
    main()

据我所知,你想进入一种模式,比如

[IG]…D.SG

并且能够生成可能组合的完整列表

基于您已经提供的内容和回答,我认为以下内容应该能够满足您的要求

import itertools

def main():
    proteins = ['A','B','C','D','E','F','G','H','I',]
    prot_seq = [['I','G',],proteins,proteins,proteins,['D',],proteins,['S',],['G'],]
    fn = open('try.txt','w')
    for x in itertools.product(*prot_seq):
        value = ''.join(x)
        fn.write(value)
        fn.write('\n')
    fn.close()

if __name__=='__main__':
    main()
请注意,我们已将您的序列指定为列表

prot_seq = [['I','G',],proteins,proteins,proteins,['D',],proteins,['S',],['G'],]
如果您不想显式spe 将prot_seq指定为一个python列表,并希望能够在给定RE-like字符串的情况下计算所有可能性

[IG]…D.SG

然后,您可以编写一个基本的解析器,将字符串表达式转换为等效的列表表达式。这个程序正是这样做的。两者的输出完全相同

import itertools
proteins = ['A','B','C','D','E','F','G','H','I',]   #Make this list as long as you want

def convert_to_seq(prot_seq_str):
    global proteins
    prot_seq = []
    for char in prot_seq_str:
        if char == '[':
            new_seq = []
            in_group = 1
        elif char == ']':
            in_group = 0
            prot_seq.append(new_seq)
        elif char == '.':
            prot_seq.append(proteins)
        else:
            if in_group == 1:
                new_seq.append(char)
            else:
                prot_seq.append(char)
    return prot_seq


def main():    
    prot_seq_str = '[IG]...D.SG'
    prot_seq = convert_to_seq(prot_seq_str)
    fn = open('try2.txt','w')
    for x in itertools.product(*prot_seq):
        value = ''.join(x)
        fn.write(value)
        fn.write('\n')
    fn.close()

if __name__=='__main__':
    main()

我不确定regex是否真的是你想要的。您可以使用正则表达式语法,但我认为您必须编写自己的解析器/生成器。我的意思是,你可以使用正则表达式,我想,如果你建立了一个包含所有可能的20**8字符组合的巨大列表,然后用正则表达式对其进行过滤,但这对我来说效率很低。只要你不打算做很长的序列,对我来说,这似乎是递归的一个很好的候选者。@sr2222 yea递归似乎是可行的。也许递归就是答案,但更一般地说,找出如何在不产生所有可能性的情况下完成任务。根据这样的模式匹配数据几乎总是更好的,而不是相反。你在解决什么问题,不让你把你的模式作为一个真正的regexp使用?@alexis:我必须从模式中创建样本数据,所以在列出所有可能性之后,我可以通过管道将它们传输到一个文件,然后将它们输入一个工具,我用它来做一个基准研究,让我看看这个工具的性能,我试着让它简短一点,但它有点复杂如果你需要创建样本数据,你只需要一个算法来遍历你的字符串并伪随机地选择一条路径通过它。您不需要为此生成和存储千兆字节的数据。我不确定regex是否真的是您想要的。您可以使用正则表达式语法,但我认为您必须编写自己的解析器/生成器。我的意思是,你可以使用正则表达式,我想,如果你建立了一个包含所有可能的20**8字符组合的巨大列表,然后用正则表达式对其进行过滤,但这对我来说效率很低。只要你不打算做很长的序列,对我来说,这似乎是递归的一个很好的候选者。@sr2222 yea递归似乎是可行的。也许递归就是答案,但更一般地说,找出如何在不产生所有可能性的情况下完成任务。根据这样的模式匹配数据几乎总是更好的,而不是相反。你在解决什么问题,不让你把你的模式作为一个真正的regexp使用?@alexis:我必须从模式中创建样本数据,所以在列出所有可能性之后,我可以通过管道将它们传输到一个文件,然后将它们输入一个工具,我用它来做一个基准研究,让我看看这个工具的性能,我试着让它简短一点,但它有点复杂如果你需要创建样本数据,你只需要一个算法来遍历你的字符串并伪随机地选择一条路径通过它。您不需要为此生成和存储千兆字节的数据。非常感谢您提供了该片段,我可以尝试从那里获取它,出于某种原因,当我将它放入文件test.py并运行它时,我得到了错误:回溯最近的调用last:file,第2行,in-NameError:未定义名称“re”,这很可能意味着我没有正确导入某些内容。请导入re。你需要学习一点python来编写你的程序。谢谢alexis,是的,我是python新手,我用java编写了很多代码,但这段代码或函数需要放在开源工具中,因此我必须用python编写很多代码,因为我提供了这段代码,我可以试着从那里开始编写,出于某种原因,当我将其放在文件test.py中并运行它时,我得到一个错误:回溯最近的调用last:file,第2行,在NameError:name're'中没有定义,这很可能意味着我没有正确导入某些内容。import re。你需要学习一点python来编写你的程序。谢谢alexis,是的,我是python新手,我用java编写了很多代码,但这段代码或函数需要放在开源工具中,因此我必须用python+1来编写它,以便在你需要的时候生成你需要的东西。您指定的字符串[IG]…D.SG有320000种可能性,而300k元素列表很难处理。对于长度更长的300个元素的蛋白质,情况会变得更糟?10^390个可能性的顺序。+1仅用于在需要时生成所需内容。您指定的字符串[IG]…D.SG有320000种可能性,而300k元素列表很难处理。对于长度更长的300个元素的蛋白质,情况会变得更糟?10^390个可能性的顺序。