Насколько я понимаю, вы хотите ввести шаблон, как
[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()