如何从类似下面的字符串构建字典是最好的方法:
"{key1 value1} {key2 value2} {key3 {value with spaces}}"
所以关键字始终是一个没有空格的字符串,但值可以是一个字符串或用大括号包含的字符串(它有空格)?
你要如何将它转换为字典形式:
{'key1': 'value1', 'key2': 'value2', 'key3': 'value with spaces'}
如何从类似下面的字符串构建字典是最好的方法:
"{key1 value1} {key2 value2} {key3 {value with spaces}}"
所以关键字始终是一个没有空格的字符串,但值可以是一个字符串或用大括号包含的字符串(它有空格)?
你要如何将它转换为字典形式:
{'key1': 'value1', 'key2': 'value2', 'key3': 'value with spaces'}
import re
x="{key1 value1} {key2 value2} {key3 {value with spaces}}"
print dict(re.findall(r"\{(\S+)\s+\{*(.*?)\}+",x))
你可以尝试这个。
输出:
{'key3': 'value with spaces', 'key2': 'value2', 'key1': 'value1'}
使用re.findall
,我们提取key
及其value
。 re.findall
返回一个包含所有键值对元组的列表。将列表元组传递给dict
函数即可得到最终答案。 在此处阅读更多信息。
print dict(re.findall(r"\{\s*(\S+)\s+\{*(.*?)\}+",x))
请输出 print dict(re.findall(r"\{\s*(\S+)\s+\{*(.*?)\}+",x))
- vks\s*
以支持两种情况。 - vks\{(\S++)\s++\{*+(.*?)\}+
。 - Falco我不能再优雅地表达了:
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]
这很hacky,但应该能胜任工作。
} {
(一对括号的结尾和另一对括号的开头)。>>> 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}']
@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'}
(?P<Brace>\{)
保存一个{
的匹配,稍后的(?(Brace)\})
只有在第一个匹配成功时才会匹配}
,因此大括号必须成对出现。通过(?(Brace)...|...)
结构,如果\Brace
匹配成功,则值部分可以包含除大括号之外的任何内容([^{}]*
),否则不允许有空格([^{}\s]*
)。map()
函数从每个列表中提取元素0和2。