#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. Большое спасибо! Это именно то, что мне было нужно!