假设您的字符串中没有比示例中更嵌套的内容,您可以首先使用前瞻/后瞻断言将字符串拆分为键值对,查找模式 } { (一对括号的结尾和另一个括号的开头。)
>>> str = '{key1 value1} {key2 value2} {key3 {value with spaces}}'
>>> pairs = re.split('(?<=})\s*(?={)', str)
这表示“匹配前面有 } 和后面有 { 的任何 \s*(空白),但不要在匹配项本身中包含这些括号。”
然后你就有了你的键值对:
>>> pairs
['{key1 value1}', '{key2 value2}', '{key3 {value with spaces}}']
可以在 maxsplit 参数设置为 1 的情况下在空格上拆分,以确保它仅在第一个空格上拆分。在这个例子中,我还使用了字符串索引([1:-1])来去掉我知道的位于每对开头和结尾的花括号。
>>> 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}']
然后只需检查值是否包含在花括号中,如果需要,在将它们放入字典之前将其删除。
如果保证键/值对总是由单个空格字符分隔,那么您可以改用普通的旧字符串拆分。
>>> kv3 = complex[1:-1].split(' ', maxsplit=1)
>>> kv3
['key3', '{value with spaces}']