2015-12-15 131 views
1

我有一個字符串,它有n用逗號分隔的數值。它看起來是這樣的 -在X個逗號後分割一個字符串數組

"0,3,03123132,\"2,59\",2015,132213131,\"This, is a message\", 
2015,223123123,\"This, is a message number 2\",2015" 

高達ň值的數量。

我已經使用以下命令來根據逗號分割值,但不能用逗號分隔雙引號內的值。

str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); 

它返回這樣的事情 -

[0,3,03123132,"2,59",2015,132213131,"This, is a message", 
2015,223123123,"This, is a message number 2",2015]... 

等多達ň

我想拆分此字符串的行和列數將等於數組[1]元素的值。在上面的例子中,它總共有3行。這些行會需要由一組從元素開始3種元素[2]

所以,最終的結果會是這個樣子 -

[03123132,"2,59",2015] 
[132213131,"This, is a message",2015] 
[223123123,"This, is a message number 2",2015] 

高達ň的行數。

我做了一些研究如何做到這一點,但它似乎並沒有提供一個簡單的方法。

任何幫助表示讚賞。

回答

1

你並不需要一個正則表達式來分割數據,該csv.reader將不正是你想要什麼:

from csv import reader 

s = "0,3,03123132,\"2,59\",2015,132213131,\"This, is a message\",2015,223123123,\"This, is a message number 2\",2015" 

print(list(reader([s])[0])) 

輸出:

['0', '3', '03123132', '2,59', '2015', '132213131', 'This, is a message', 
'2015', '223123123', 'This, is a message number 2', '2015'] 

爲了你能zip組,從指數開始2:

it = iter(list(reader([s]))[0][2:]) 

print(list(zip(it,it,it))) 

哪個會給你:

[('03123132', '2,59', '2015'), ('132213131', 'This, is a message', '2015'), ('223123123', 'This, is a message number 2', '2015')] 

或者用itertools.islice避免切片和創建新的列表:

from csv import reader 

from itertools import islice 

it = islice(next(reader([s])), 2, None) 

print(list(zip(it, it, it))) 

的輸出結果相同:

[('03123132', '2,59', '2015'), ('132213131', 'This, is a message', '2015'), ('223123123', 'This, is a message number 2', '2015')] 
+0

謝謝您的回覆,帕德里克。該列表由11個元素組成,並且忽略列表的前兩個元素將爲您提供3行,每行3個元素。從元素[2]開始行。對不起,如果我以前不夠清楚。 – callMeJava

+0

@callMeJava,是的,我錯過了,在這裏遲到!無論如何,所有你需要的是csv閱讀器和zip –

+0

感謝堆,Padraic。這解決了我的問題! – callMeJava

相關問題