2017-09-18 16 views
0

我有一個特殊的編碼格式,我想要一個提取編碼信息的正則表達式。我有':'作爲分隔不同「塊」信息的特殊字符。例如:正則表達式匹配,獲取由分隔符標記分隔的所有組?

s = 'P:1:a:3:test_data' 

應該得到斯普利特:

['P','1','a','3','test_data'] 

我可以使用:

s.split(':') 

不過,我可以有一個 ':' 被編碼以及(會有永遠不會超過1':'組合在一起,所以沒有歧義)。因此,例如:

s = 'P:1:::3:test_data' 

應該給:

['P','1',':','3','test_data'] 

採用分體式( ':')未能在這裏:

['P', '1', '', '', '3', 'test_data'] 

什麼是捕捉的最佳途徑 ':'?我用正則表達式不是很強大,我知道正則表達式組可以使用'* +'匹配至少一個字符,但是我很困惑如何將它們拼湊在一起。更好的是,沒有正則表達式,還有更好的方法嗎?我想我總是可以迭代數組,檢查連續的空字符串並將它們合併爲':'。有沒有更優雅的做法呢?

感謝

+0

應將'P:1 ::::: 3:test_data'分成多少個? 'P,1,:,:,3,test_data'或'P,1,:::,3,test_data'? – Psidom

+0

你可以用group來正則表達式,我試過[這個正則表達式](https://regex101.com/r/pKIqak/1),它可以工作。 –

+0

@Psidom根據我正在使用的數據類型,這絕不會發生。這就是說,'P,1,:,3,test_data'是正確的行爲。 –

回答

0

針對您的特殊情況下,可以使用負看看周圍,以限制你想拆就(?<!:):|:(?!:),這是不是在同一時間之前和之後的另一結腸結腸結腸:

import re 
s = 'P:1:a:3:test_data' 
s1 = 'P:1:::3:test_data' 

re.split("(?<!:):|:(?!:)", s) 
# ['P', '1', 'a', '3', 'test_data'] 

re.split("(?<!:):|:(?!:)", s1) 
# ['P', '1', ':', '3', 'test_data'] 

另一種選擇是更一般的,可以處理多於一個:re.findall(.+?)(?::|$)分組,即懶惰地匹配的至少一個字符,直到它連接nds冒號或到達字符串末尾:

re.findall('(.+?)(?::|$)', 'P:1:::3:test_data') 
# ['P', '1', ':', '3', 'test_data'] 

re.findall('(.+?)(?::|$)', 'P:1:::::3:test_data') 
# ['P', '1', ':', ':', '3', 'test_data'] 
相關問題