Получение всех возможных комбинаций строки регулярного выражения

#python #combinations #permutation

Вопрос:

У меня есть регулярное выражение: ATG(C|G|A)(C|T)GA

Приведенное выше регулярное выражение может принимать любую форму только со | специальными символами ИЛИ () в любой позиции строки и любым количеством алфавитов в скобках.

Я хочу сопоставить все комбинации этой строки в списке:

 ATGCCGA
ATGCTGA
ATGGCGA
ATGGTGA
ATGACGA
ATGATGA
 

Я не могу найти ни одной библиотеки python, которая могла бы это сделать.

Комментарии:

1. re.findall(r'(?=(ATG[CGA][CT]GA))', text) Работает ли это на вас?

Ответ №1:

Вы можете взять декартово произведение динамических частей строки, используя itertools.product затем соединение с другими статическими частями строки.

 >>> from itertools import product
>>> [f'ATG{i}{j}GA' for i,j in product('CGA', 'CT')]
['ATGCCGA', 'ATGCTGA', 'ATGGCGA', 'ATGGTGA', 'ATGACGA', 'ATGATGA']
 

Комментарии:

1. Спасибо за ответ!

Ответ №2:

Вы можете использовать рекурсию:

 import collections
s = 'ATG(C|G|A)(C|T)GA'
def combos(d):
   r, k = [], None
   while d:
      if (c:=d.popleft()) not in '|()':
         k = (k if k else '') c
      elif c == '|':
         if k:
            r.append(k)
         k = None
      elif c == '(':
         r = [v (k or '') i for i in combos(d) for v in (r if r else [''])]
         k = None
      else:
         if k:
            r.append(k)
         k = None
         break
   yield from ([i (k or '') for i in r] if r else [k])

print(list(combos(collections.deque(list(s)))))
 

Выход:

 ['ATGCCGA', 'ATGGCGA', 'ATGACGA', 'ATGCTGA', 'ATGGTGA', 'ATGATGA']
 

Комментарии:

1. Большое спасибо! Это именно то, что мне было нужно!