Giả sử bạn không có bất kỳ thứ gì trong chuỗi lồng nhiều hơn trong ví dụ của bạn, trước tiên bạn có thể sử dụng xác nhận lookahead/lookbehind để chia chuỗi thành cặp khóa-giá trị, tìm mẫu } {
(phần cuối của một cặp dấu ngoặc và đầu của người khác.)
>>> str = '{key1 value1} {key2 value2} {key3 {value with spaces}}'
>>> pairs = re.split('(?<=})\s*(?={)', str)
này nói "trận đấu trên bất kỳ \s*
(khoảng trắng) mà có một }
trước khi nó và một {
sau nó, nhưng không bao gồm những dấu ngoặc trong chính trận đấu. "
Sau đó, bạn có cặp khóa-giá trị của bạn:
>>> pairs
['{key1 value1}', '{key2 value2}', '{key3 {value with spaces}}']
mà có thể được chia vào khoảng trắng với maxsplit
tham số thiết lập để 1, để đảm bảo rằng nó chỉ chia trên không gian đầu tiên. Trong ví dụ này, tôi cũng đã sử dụng chỉ mục chuỗi ([1:-1]
) để loại bỏ các dấu ngoặc nhọn mà tôi biết là ở đầu và cuối của mỗi cặp.
>>> simple = pairs[0]
>>> complex = pairs[2]
>>> simple
'{key1 value1}'
>>> complex
'{key3 {value with spaces}}'
>>> simple[1:-1]
'key1 value1'
>>> kv = re.split('\s+', simple[1:-1], maxsplit=1)
>>> kv
['key1', 'value1']
>>> kv3 = re.split('\s+', complex[1:-1], maxsplit=1)
>>> kv3
['key3', '{value with spaces}']
sau đó chỉ cần kiểm tra xem giá trị có được đặt trong dấu ngoặc nhọn và xóa chúng nếu bạn cần trước khi đưa chúng vào từ điển của bạn.
Nếu đảm bảo rằng các cặp khóa/giá trị sẽ luôn được phân tách bằng ký tự khoảng trắng, thì bạn có thể sử dụng chia chuỗi đồng bằng cũ thay thế.
>>> kv3 = complex[1:-1].split(' ', maxsplit=1)
>>> kv3
['key3', '{value with spaces}']
Làm thế nào để bạn xác định "cách tốt nhất"? Nhanh chóng, thanh lịch, có thể duy trì, ...? Ngoài ra, bạn đã thử gì? Điều gì làm việc và những gì không? Tại sao không? –