【问题标题】:Getting all possible combinations of a regular expression string获取正则表达式字符串的所有可能组合
【发布时间】:2021-09-28 16:58:54
【问题描述】:

我有一个正则表达式:ATG(C|G|A)(C|T)GA

上述正则表达式可以采用任何形式,在字符串中的任意位置仅包含 OR (|) 特殊字符,并且括号内包含任意数量的字母。

我想在一个列表中匹配这个字符串的所有组合:

ATGCCGA
ATGCTGA
ATGGCGA
ATGGTGA
ATGACGA
ATGATGA

我找不到任何可以做到这一点的 python 库。

【问题讨论】:

  • re.findall(r'(?=(ATG[CGA][CT]GA))', text) 适合你吗?

标签: python combinations permutation


【解决方案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']

【讨论】:

  • 感谢您的回答!
【解决方案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']

【讨论】:

  • 非常感谢!这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多