Zakładając, że nie masz nic w ciąg bardziej niż to, co jest zagnieżdżony w swoim przykładzie, można najpierw użyć uprzedzona/lookbehind twierdzeń podzielić ciąg na swoich par klucz-wartość, patrząc na wzór } {
(koniec jednej pary wsporników i na początku drugiego.)
>>> str = '{key1 value1} {key2 value2} {key3 {value with spaces}}'
>>> pairs = re.split('(?<=})\s*(?={)', str)
To mówi „spotkanie na każdym \s*
(spacji), który ma }
przed nim i {
po nim, ale nie obejmują tych wsporników w samym meczu. "
Wtedy masz swoje pary klucz-wartość:
>>> pairs
['{key1 value1}', '{key2 value2}', '{key3 {value with spaces}}']
które można podzielić na białe znaki z parametrem maxsplit
ustawiony na 1, aby upewnić się, że dzieli się tylko na pierwszym miejscu. W tym przykładzie użyłem także indeksowania ciągów ([1:-1]
), aby pozbyć się nawiasów klamrowych, które znam na początku i na końcu każdej pary.
>>> 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}']
potem po prostu sprawdzić, czy wartość jest ujęty w nawiasy klamrowe i usunąć je, jeśli trzeba przed włożeniem ich do swojego słownika.
Jeśli jest zagwarantowane, że pary klucz/wartość będą zawsze oddzielone pojedynczym znakiem spacji, można zamiast tego użyć zwykłego starego ciągu znaków.
>>> kv3 = complex[1:-1].split(' ', maxsplit=1)
>>> kv3
['key3', '{value with spaces}']
Jak definiujesz "najlepszy sposób"? Szybka, elegancka, łatwa do utrzymania, ...? Co ty wypróbowałeś sam? Co zadziałało, a co nie? Dlaczego nie? –