2011-11-21 36 views
11

Tôi muốn chia một chuỗi trên một dấu phẩy, nhưng bỏ qua trường hợp khi nó nằm trong dấu ngoặc kép:Chia chuỗi, bỏ qua dấu phân cách trong dấu ngoặc kép (python)

ví dụ:

teststring = '48, "one, two", "2011/11/03"' 
teststring.split(",") 
['48', ' "one', ' two"', ' "2011/11/03"'] 

và sản lượng tôi muốn là:

['48', ' "one, two"', ' "2011/11/03"'] 

Điều này có thể?

Trả lời

1

Bạn nên sử dụng thư viện Python csv: http://docs.python.org/library/csv.html

+1

liên kết đó là không đủ để giải quyết vấn đề. Ngay bên ngoài hộp, trình đọc csv sẽ không phân tích chính xác chuỗi kiểm tra của OP. –

6

Bạn có thể sử dụng the csv module từ thư viện tiêu chuẩn:

>>> import csv 
>>> testdata = ['48, "one, two", "2011/11/03"'] 
>>> testcsv = csv.reader(testdata,skipinitialspace=True) 
>>> testcsv.next() 
['48', 'one, two', '2011/11/03'] 

Một điều cần xem ra cho là csv.reader đối tượng mong đợi một iterator mà sẽ trả lại một chuỗi mỗi lần next() được gọi. Điều này có nghĩa rằng bạn không thể vượt qua một chuỗi chuỗi thẳng đến một reader(), nhưng bạn có thể đặt nó bên trong một danh sách như trên.

Bạn sẽ phải cẩn thận với các định dạng dữ liệu của bạn hoặc nói csv làm thế nào để xử lý nó. Theo mặc định có dấu ngoặc kép phải đến ngay sau dấu phẩy hoặc csv mô-đun sẽ giải thích các lĩnh vực như đầu với một không gian chứ không phải được trích dẫn. Bạn có thể sửa lỗi này bằng cách sử dụng the skipinitialspace option.

+0

Điều này không giải quyết được vấn đề của OP. "One, two" không nên tách ra, bởi vì dấu phẩy nằm trong dấu ngoặc kép, hoặc làm tôi hiểu sai cái gì? Tôi đã thử điều này ở đây bởi chính tôi và có kết quả tương tự như bạn, đọc doc [csv] (http://docs.python.org/library/csv.html#dialects-and-formatting-parameters), tôi hiểu rằng theo mặc định, nó sẽ theo dõi mọi thứ bên trong dấu ngoặc kép dưới dạng một trường, theo mặc định. – stema

+0

@Dave webb: Djmac muốn '" một, hai "' trong biến duy nhất không phải là trường hợp trong câu trả lời của bạn ... anh ta yêu cầu đầu ra là '[' 48 ',' "một, hai" ',' "2011/11/03 "']', length = 3 trong trường hợp của bạn dài = 4 – avasal

+0

@stema - Tốt! Tôi không đọc hết mã nguồn của mình. Nó chỉ ra vấn đề là với các dữ liệu mẫu.Nếu một trường bắt đầu bằng dấu cách thì 'csv' giả định trường cũng vậy và' '' là một phần của trường, nghĩa là 'csv' không tự động cắt từng giá trị. Tôi đã sửa dữ liệu mẫu và mã hiện hoạt động Cảm ơn bạn đã chỉ ra điều này –

3

Bạn có thể sử dụng shlex module để phân tích chuỗi của bạn.

Theo mặc định, shlex.split sẽ chia chuỗi tại ký tự khoảng trắng không kèm theo trong dấu ngoặc kép:

>>> shlex.split(teststring) 
['48,', 'one, two,', '2011/11/03'] 

này không loại bỏ các dấu phẩy trailing từ chuỗi của bạn, nhưng nó gần với những gì bạn cần. Tuy nhiên, nếu bạn tùy chỉnh các phân tích cú pháp để xem xét dấu phẩy là một nhân vật khoảng trắng, sau đó bạn sẽ nhận được đầu ra mà bạn cần:

>>> parser = shlex.shlex(teststring) 
>>> parser.whitespace 
' \t\r\n' 
>>> parser.whitespace += ',' 
>>> list(parser) 
['48', '"one, two"', '"2011/11/03"'] 

Lưu ý: đối tượng phân tích cú pháp được sử dụng như một iterator để có được các thẻ từng người một. Do đó, list(parser) lặp trên các đối tượng phân tích cú pháp và trả về chuỗi tách nơi bạn cần.

+0

Việc này được thực hiện, nhưng không phải là ' t là tốt của af nó như mô-đun csv. –

23

Các csv module sẽ làm việc nếu bạn thiết lập tùy chọn để xử lý phương ngữ này:

>>> import csv 
>>> teststring = '48, "one, two", "2011/11/03"' 
>>> for line in csv.reader([teststring], skipinitialspace=True): 
    print line 


['48', 'one, two', '2011/11/03'] 
+3

+1: bắt thú vị, cho 'skipinitialspace' này! Tôi đã cố gắng để hiểu các tài liệu 'csv' nhưng không thể có được đầu vào OP để làm việc :) –

-1
import shlex 
teststring = '48, "one, two", "2011/11/03"' 
output = shlex.split(teststring) 
output = [re.sub(r",$","",w) for w in output] 
print output 
['48', 'one, two', '2011/11/03'] 
Các vấn đề liên quan