2011-01-21 33 views
9

Tôi có chuỗi như sau:Tạo từ điển từ không gian tách ra chìa khóa string = giá trị bằng Python

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

Tôi muốn chuyển đổi vào một từ điển như sau:

 
key | value 
-----|-------- 
key1 | 1234 
key2 | string with space 
key3 | SrtingWithoutSpace 

Làm thế nào để làm điều này bằng Python?

+0

Điều gì sẽ xảy ra nếu chuỗi của bạn là ''key1 =" "foo" bar key2 = "baz''? –

+0

Tôi đang phân tích cú pháp đầu ra của tệp nhật ký và tôi không mong đợi đầu ra ở bất kỳ định dạng nào khác. –

Trả lời

15

Hãy thử điều này:

>>> import re 
>>> dict(re.findall(r'(\S+)=(".*?"|\S+)', s)) 
{'key3': '"SrtingWithoutSpace"', 'key2': '"string with space"', 'key1': '1234'} 

Nếu bạn cũng muốn dải có dấu ngoặc kép:

>>> {k:v.strip('"') for k,v in re.findall(r'(\S+)=(".*?"|\S+)', s)} 
+0

Cảm ơn bạn. Điều này giải quyết được vấn đề của tôi. –

+0

Tôi không thể hiểu tại sao regex lại là r '(\ S +) = (". *?" | \ S +)', trái ngược với r '(\ S +) = (\ ". *? \" | \ S +) '. Bạn không cần phải thoát khỏi nhân vật đặc biệt? Hay bạn chỉ biết rằng "không có ý nghĩa đặc biệt trong python regex? – AlanSE

18

Lớp shlex làm cho nó dễ dàng để viết phân tích từ vựng cho cú pháp đơn giản giống của vỏ Unix. Điều này thường hữu ích khi viết minilanguages, (ví dụ: chạy các tệp điều khiển cho các ứng dụng Python) hoặc để phân tích các chuỗi được trích dẫn.

import shlex 

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

print dict(token.split('=') for token in shlex.split(s)) 
Các vấn đề liên quan