2017-10-13 126 views
0

假設我有一個看起來像這樣的列表:變量序列生成列表排列組合Lenghts

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'] 

的問題是,如果我只從beast中提取出['P', 'O', 'R', 'S', 'P', 'O'],那麼在發生該模式之前,我錯過了之前的P

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

因此,在這些基本模式的每一個字母可在感擴展:

O可以一起發生三次。

Ps可以一起出現兩次。

R可以同時出現兩次。

S只能出現一次。

我想生成所有可能的排列列表,但不知道從哪裏開始。

我寫了一個天真的Python代碼替換的O每次出現三鋨等,但導致 -

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

當我需要找哪家都不行: ['O', 'R', 'O', 'O']

任何幫助表示讚賞。謝謝。

+0

這實際上聽起來像是一個正則表達式的工作。 – user2357112

+0

在列表上?我以前從未使用Regex。 –

+0

你不能在'beast'中直接執行正則表達式搜索,但是你可以在'''.join(beast)'上執行一次。 – user2357112

回答

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,並參閱任意數量的在線教程以獲取有助於習慣編寫正則表達式的幫助。