我正在尝试编写一些可以列出reg-ex表达式的可能性的代码。请注意,这个表达式稍有不同,每个字母代表一个蛋白质,因此它有限,例如:
[IG]...D.SG
这基本上暗示如果我列出所有可能性,我会得到类似的东西:第一个字母可以是I或G,然后第二个字母可以是20个蛋白质字母中的任何一个,第三个字母是20个字母中的任何一个,第五个可以是20个中的任何一个,第六个可以是D,第七个可以是20个中的任何一个,最后两个是固定为SG的。
我知道通过使用itertools.product()我可以做类似的事情,例如:
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
如何将其扩展到我的问题?谢谢您的帮助。
答案 0 :(得分:2)
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)
答案 1 :(得分:2)
要生成示例数据(正如您的评论所说),您不应该生成完整的可能性!既然你说过“蛋白质”这个词,那就计算出有多少可能性以及你需要多少磁盘空间进行一次真实测试,你就会明白为什么这是一个非首发。
RE(包括你的)描述了一个有限状态自动机,我认为将你的转换成一个可以随机遍历以生成数据的形式是有意义的。如果您的RE只有字符范围和通配符(。),那么由于没有循环,它将非常简单:将'[IG]...D.SG'
转换为表格中的列表
[ 'IG', '.', '.', '.', 'D', '.', 'S', 'G' ]
并遍历列表,从每个步骤的选项中随机选择一个字母random.choice
- 如果字母是“。”,则从整个字母表中选择一个字母。 (或者不要转换它,只是按原样遍历它。但是转换将问题分成两个简单的部分。)
答案 2 :(得分:0)
如果您正在寻找通用解决方案,可以检查http://code.google.com/p/xeger/
的代码答案 3 :(得分:0)
据我所知,您想要输入类似
的模式[IG] ... D.SG
能够生成可能组合的完整列表。
根据您已经提供的内容并通过alexis回答,我认为以下内容应该可以做您想做的事情
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之类的字符串
[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()