如何仅获取字符串中包含的列表中的第一个元素?

How to get only first element in list contained in string?

我有一个很长的字符串。这个字符串包含一个列表,像这样的例子

'[{"ex1": 0, "ex2":1}, {"ex3": 2, "ex4":3}]'

我可以使用json5.loads然后在列表中使用[0]获取第一个元素,但是json5.loads对于较长的字符串需要很长时间。有没有办法只获取第一个元素而不加载整个列表? (在此示例中,它将是 {"ex1": 0, "ex2":1}。用逗号分隔对我不起作用,因为列表中的字典中包含逗号。谢谢。

如果肯定是那种格式,你可以只搜索开始和结束括号。

mystr = '[{"ex1": 0, "ex2":1}, {"ex3": 2, "ex4":3}]'
first = mystr.index("{")
last = mystr.index("}")
extracted = mystr[first:last+1]
print(extracted)

这打印 '{"ex1": 0, "ex2":1}'

对于更复杂的字符串:

mystr = '[{"ex1": {"ex1.33": -1, "ex1.66": -2}, "ex2":1}, {"ex3": 2, "ex4":3}]'
n_open = 0
n_close = 0
first = mystr.index("{")
for ii in range(len(mystr)):
    if mystr[ii] == "{":
        n_open += 1
    elif mystr[ii] == "}":
        n_close += 1
    if n_open > 0 and n_open == n_close:
        break
extracted = mystr[first:ii+1]

您的字符串是否适用于 ast.literal_eval()?如果是这样,你可以做

obj = ast.literal_eval(s)
# obj[0] gives the first dict

如果不是,您可以遍历字符串 character-by-character 并在 open-brackets 的数量等于 close-brackets 的数量时生成任何子字符串。

def get_top_level_dict_str(s):
  open_br = 0
  close_br = 0
  open_index = 0
  for i, c in enumerate(s):
    if c == '{':
        if open_br == 0: open_index = i 
        open_br += 1
    elif c == '}':
        close_br += 1
        if open_br > 0 and open_br == close_br:
            yield s[open_index:i+1]
            open_br = close_br = 0

如果你想将生成的子字符串解析为对象,你可以像你已经做的那样使用 json5,这在较小的字符串上可能更快,或者使用 ast.literal_eval()

x = get_top_level_dict_str(s)
# next(x) gives the substring
# then use json5 or ast.literal_eval()