RegEx: список всех возможностей для создания примера кода в Python - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь написать некоторый код, который может перечислить возможности, заданные выражением 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

Как я могу распространить это на мою проблему?Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Чтобы сгенерировать образец данных (поскольку ваш комментарий говорит, что вам нужно), вы не должны генерировать полный набор возможностей!Поскольку вы сказали слово «белок», подсчитайте, сколько существует возможностей и сколько места на диске вам понадобится для одного реального теста, и вы поймете, почему это не стартер.

RE (включая ваш) описывает автомат конечного состояния, и я думаю, что имеет смысл преобразовать ваш в форму, которую вы можете перемещать случайным образом для генерации данных.Если ваши RE имеют только диапазоны символов и подстановочные знаки (.), Это будет довольно тривиально, поскольку циклов нет: преобразуйте '[IG]...D.SG' в список в форме

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

и просмотрите список, выбравбуква произвольно с random.choice из опций на каждом шаге - или из всего алфавита, если буква "."(Или не конвертируйте его, просто просмотрите его как есть. Но преобразование делит проблему на две простые части).

2 голосов
/ 12 марта 2012

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)
0 голосов
/ 14 марта 2012

Насколько я понимаю, вы хотите ввести шаблон, как

[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()
0 голосов
/ 13 марта 2012

Если вы ищете универсальное решение, вы можете проверить код http://code.google.com/p/xeger/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...