2011-10-24 29 views
9

Khi sử dụng hàm phân tách chuỗi Python(), có ai có một thủ thuật tiện lợi để xử lý các mục được bao quanh bởi dấu nháy kép dưới dạng từ không tách rời không?Không chia các từ được trích dẫn kép với phân tách chuỗi Python()?

Nói rằng tôi muốn chia chỉ vào khoảng trắng và tôi có điều này:

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
>>> myStr.split() 
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R'] 

Tôi muốn đối xử với bất cứ điều gì trong hai dấu ngoặc kép như một từ duy nhất, ngay cả khi không gian trắng được nhúng, vì vậy sẽ muốn kết thúc với dưới đây:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 

Hoặc ít nhất này và sau đó tôi sẽ tước hai dấu ngoặc kép:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 

Bất kỳ đề xuất không phải là regex nào?

Trả lời

30

Bạn thắng . 't có thể nhận được hành vi này với str.split() Nếu bạn có thể sống với phân tích cú pháp khá phức tạp nó (như bỏ qua dấu ngoặc kép trước bởi một dấu gạch chéo sau), shlex.split() có thể được những gì bạn đang tìm kiếm:

>>> shlex.split(myStr) 
['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 
+2

+100, wow, không bao giờ nghe nói về shlex –

+1

Cảm ơn bạn Sven --- đó chính xác là những gì tôi đang tìm kiếm! – Rob

+0

tuyệt vời, rất hữu ích. Cảm ơn! – liang

0

tôi đề nghị bạn tìm kiếm với re cho mô hình "[^"] *" và áp dụng String.split chỉ vào các bộ phận còn lại. Bạn có thể thực hiện một hàm đệ quy mà xử lý tất cả các phần chuỗi có liên quan.

1

@ Rob: tại sao không có regexes nếu giải pháp regexp đơn giản như vậy?

my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
print re.findall(r'(\w+|".*?")', my_str) 
['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 
+0

+1 Giải pháp rất đẹp! – hochl

+0

@PabloG - Mặc dù thường là giải pháp dễ dàng trả trước, tôi chưa đích thân gặp phải trường hợp regex không có chi phí dài hạn hơn. Đối với trường hợp cụ thể này, tôi đã khá chắc chắn đây là một vấn đề được giải quyết và tôi chỉ có thể tìm thấy nó --- xuất hiện Sven chỉ cho tôi đi đúng hướng với sự lúng túng. – Rob

Các vấn đề liên quan