Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将嵌入括号的字符串转换为字典_Python_Regex_Dictionary - Fatal编程技术网

Python 将嵌入括号的字符串转换为字典

Python 将嵌入括号的字符串转换为字典,python,regex,dictionary,Python,Regex,Dictionary,从以下字符串构建词典的最佳方法是什么: "{key1 value1} {key2 value2} {key3 {value with spaces}}" 所以键总是一个没有空格的字符串,但是值是一个字符串还是一个花括号中的字符串(它有空格) 您将如何将其口述成: {'key1': 'value1', 'key2': 'value2', 'key3': 'value with spaces'} 你可以试试这个 输出: {'key3': 'value with spaces', 'key

从以下字符串构建词典的最佳方法是什么:

"{key1 value1} {key2 value2} {key3 {value with spaces}}"
所以键总是一个没有空格的字符串,但是值是一个字符串还是一个花括号中的字符串(它有空格)

您将如何将其口述成:

{'key1': 'value1',   'key2': 'value2',   'key3': 'value with spaces'}
你可以试试这个

输出:

{'key3': 'value with spaces', 'key2': 'value2', 'key1': 'value1'}

这里使用
re.findall
我们提取
key
及其
value
re.findall
返回一个包含所有键、值对的元组的列表。在元组列表中使用
dict
提供最终答案

假设字符串中没有比示例中更嵌套的内容,可以首先使用lookahead/lookback断言将字符串拆分为键值对,查找模式
}{
(一对括号的末尾和另一对括号的开头)

可以将
maxslit
参数设置为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}']

我无法让它更优雅:

input = "{key1 value1} {key2 value2} {key3 {value with spaces}}"
x = input.split("} {")             # creates list with keys and values
y = [i.split(" {") for i in y]     # separates the list-values from keys
# create final list with separated keys and values, removing brackets
z = [[i.translate(None,"{").translate(None,"}").split() for i in j] for j in y]

fin = {}
for i in z:
    fin[i[0][0]] = i[-1]

这是一个非常粗糙的问题,但它应该可以解决这个问题。

由@vks给出的答案并没有检查平衡大括号。请尝试以下方法:

>>> x="{key3 {value with spaces} {key4 value4}}"
>>> dict(re.findall(r"\{(\S+)\s+\{*(.*?)\}+",x))
{'key3': 'value with spaces', 'key4': 'value4'}
请尝试:

>>> dict(map(lambda x:[x[0],x[2]], re.findall(r'\{(\S+)\s+(?P<Brace>\{)?((?(Brace)[^{}]*|[^{}\s]*))(?(Brace)\})\}',x)))
{'key4': 'value4'}
dict(map(lambda x:[x[0],x[2]],re.findall(r'\{(\S+)\S+(?P\{)(((?(大括号)[^{}]*.[^{}\S]*)((?(大括号)\})\},x))) {'key4':'value4'} 也就是说,它仅与具有正确支撑的零件匹配

(?p\{)
保存了一个
{
的匹配,之后的
(?(大括号)\}
将只在第一个匹配的情况下匹配
,因此大括号必须成对出现。通过
(?(大括号)…)
构造,如果
\Brace
匹配,值部分可以包含大括号以外的任何内容(
[^{}]*
),否则不允许有空格(
[^{}\s]*

由于可选大括号在regexp中匹配,因此在列表中返回,我们需要通过
map()
函数从每个列表中提取元素0和2


regexp很容易变得混乱。

这真是太棒了!如果你能发布一点解释,让我能更好地学习和理解这一点,那将是一件好事。谢谢。@vks太棒了!我该如何更新它以支持括号中带空格的情况:“{key1 value1}{key2 value2}{key3{value with spaces}”@mtmt
print dict(re.findall(r“{\s*(\s+)\s+\{*(.*)\}+”,x))
实际上,对于带有空格的情况,这将是一个简单的更改“{(\s+)\s+\{(.?)\}+”我只需要想一个方法来支持这两个scenarios@mtmt将其更改为
\s*
以支持这两种情况,尽管第三个值是一个值列表。vks的答案无论如何要好得多。这可能有点老套,但似乎避免了公开的正则表达式,这在某些情况下可能是有益的。您如何定义“最佳方法”?快速、优雅、可维护……?还有,您自己做过哪些尝试?哪些有效,哪些无效?为什么不?
input = "{key1 value1} {key2 value2} {key3 {value with spaces}}"
x = input.split("} {")             # creates list with keys and values
y = [i.split(" {") for i in y]     # separates the list-values from keys
# create final list with separated keys and values, removing brackets
z = [[i.translate(None,"{").translate(None,"}").split() for i in j] for j in y]

fin = {}
for i in z:
    fin[i[0][0]] = i[-1]
>>> x="{key3 {value with spaces} {key4 value4}}"
>>> dict(re.findall(r"\{(\S+)\s+\{*(.*?)\}+",x))
{'key3': 'value with spaces', 'key4': 'value4'}
>>> dict(map(lambda x:[x[0],x[2]], re.findall(r'\{(\S+)\s+(?P<Brace>\{)?((?(Brace)[^{}]*|[^{}\s]*))(?(Brace)\})\}',x)))
{'key4': 'value4'}