2013-02-12 60 views
-2

我有一個字符串,必須提取。問題是我無法在重複中描述重複。因此,這裏是代碼:Python正則表達式重複組內重複

f = "Makimak-cg_mk_Mokarmi" 
pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_]([a-z]{2}))+)" 
mO = re.match(pattern, f) 
print mO.groups() 

而結果將是:

('Makimak', '-cg_mk', 'mk') 

但我想獲得的元組是這樣的:

('Makimak', '-cg_mk', 'cg', 'mk') 

所以有一組「 - cg_mk「,其中包括兩個字符模式的重複。但是,就是這樣沒有事情:

[a-z]{2}+ 

結果的羣體給予回覆只有在這裏表示,重複的最後一部分:

([a-z]{2}) 

我的想法是,應該有一個「+」太這樣:

([a-z]{2})+ 

它給出了相同的結果。生成匹配對象,只是我無法獲得我想要的組。

+3

我懷疑這是可能的一個簡單的Python正則表達式使用're'。 AFAIK,'re'內的所有功能處理*非重疊*發生。捕捉重疊的發生似乎相當艱鉅... – mgilson 2013-02-12 17:21:07

+0

你能解釋更多關於你想要達到的目標嗎?爲什麼你需要重複輸出?這應該與其他什麼輸入? – deadly 2013-02-12 17:30:08

+0

我只是好奇我能用模塊做些什麼。是否有可能在一行中得到我上面描述的結果。當然,我認爲像F.J寫的解決方案。 – Prag 2013-02-13 10:07:01

回答

0

你可能需要做這兩個步驟:

>>> f = "Makimak-cg_mk_Mokarmi" 
>>> pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_][a-z]{2})+)" 
>>> mO = re.match(pattern, f) 
>>> print mO.groups() + tuple(re.split('[-_]', mO.group(2))[1:]) 
('Makimak', '-cg_mk', 'cg', 'mk') 

這只是拍攝組('Makimak', '-cg_mk'),然後以極快的第二組上的-_出現的結果,結合這一點。

如果你總是知道兩個字符模式的確切數量,你可以用前瞻來實現這一點,但它看起來並不像預先知道的那樣,或者你不需要重複。