生成变量序列Lenghts的列表排列

时间:2017-10-13 20:59:46

标签: python regex algorithm permutation

假设我有一个如下所示的列表:

beast = ['E', 'O', 'R', 'E', 'O', 'S', 'P', 'E', 'P', 'P', 'O', 'R', 'S', 'P', 'O', 'E']

现在,以下是我想要提取的基本模式:

basic_oros = ['O', 'R', 'O']

pi_poro = ['P', 'O', 'R', 'O']

pi_orpo = ['O', 'R', 'P', 'O']

pi_porpo = ['P', 'O', 'R', 'P', 'O']

si_orso = ['O', 'R', 'S', 'O']

spi_orspo = ['O', 'R', 'S', 'P', 'O']

spi_porso = ['P', 'O', 'R', 'S', 'O']

spi_porspo = ['P', 'O', 'R', 'S', 'P', 'O']

问题是,如果我只从['P', 'O', 'R', 'S', 'P', 'O']中提取beast,那么在该模式发生之前我错过了之前的P

(更好的例子 - 也可以有['O', 'O', 'R', 'O', 'O', 'O']

因此,这些基本模式中的每个字母都可以在以下意义上扩展:

  Os可以一起发生三次。

     

Ps可以一起发生两次。

     

Rs可以一起发生两次。

     

Ss只能出现一次。

我想生成所有可能排列的列表,但不知道从哪里开始。

我编写了一个天真的python代码,用三个Os等替换每次出现的O.但是这会导致 -

['O', 'O', 'O', 'R' 'O', 'O', 'O']

当我需要找到时,它不会起作用: ['O', 'R', 'O', 'O']

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

这听起来像是正则表达式的工作。如果将beast列表加入到''.join(beast)的字符串中,则可以构建正则表达式以搜索匹配特定模式的子字符串。例如,使用{m,n}量词来搜索子模式的一定数量的重复,您可以使用

re.search(r'O{1,3}R{1,2}O{1,3}', ''.join(beast))

搜索由1到3个Os,1到2个Rs和1到3个Os组成的模式。

有关Python正则表达式语法和函数的更多信息,请参阅re module documentation,并查看任意数量的在线教程,以帮助您习惯编写正则表达式。