Python 提取括号内的文本并存储在字典中

Python 提取括号内的文本并存储在字典中,python,regex,parsing,dictionary,text-processing,Python,Regex,Parsing,Dictionary,Text Processing,我正在尝试将所有函数分隔在方括号内,并将它们存储在字典中。但是,输出会从除最后一个输出外的所有输出中剥离闭合支架 import re line="[f(x,y),g(y,z),f1(x1,y1)]" matches = re.match(r"(.*)(\[)(.*)(\])(.*)", line) if matches: all_action_labels = matches.group(3) sep_action_labels = re.split(r'\),',all_act

我正在尝试将所有函数分隔在方括号内,并将它们存储在字典中。但是,输出会从除最后一个输出外的所有输出中剥离闭合支架

import re
line="[f(x,y),g(y,z),f1(x1,y1)]"
matches = re.match(r"(.*)(\[)(.*)(\])(.*)", line)
if matches:
    all_action_labels = matches.group(3)
    sep_action_labels = re.split(r'\),',all_action_labels)
    j=0
    for x in sep_action_labels:
        print(f'Function #{j+1} : {x}')
如您所见,除最后一个输出外,所有输出都缺少右括号“)”:

Function #1 : f(x,y
Function #1 : g(y,z
Function #1 : f1(x1,y1)
我应该使用什么正则表达式


此外,如何将这些输出存储在字典中?

我提取数据的一般规则是使用相当简单的正则表达式调用
re.findall()

也许这能满足您的需求:

import re
line="[f(x,y),g(y,z),f1(x1,y1)]"
all_action_labels = re.findall(r"\[(.*?)]", line)
for all_action_label in all_action_labels:
    sep_action_labels = re.findall(r"[a-z0-9]+\(.*?\)", all_action_label)
    for j, x in enumerate(sep_action_labels, 1):
        print(f'Function #{j} : {x}')

我使用一个简单的正则表达式从
[]
提取数据,另一个用于提取单个函数调用

如果您不需要使用正则表达式,那么这样做可能更容易。这很容易理解,它只需遍历字符串,并将函数字符串放入列表中,而且它还跟踪括号,因此可以很好地处理带有多个逗号的函数

def getFuncList(line):
  """
  Assumes comma seperated, and opends and closes with square brackets
  """
  line = line[1:-1] # strip square brackets
  funcs = []

  current = ""
  brack_stack = 0 # we don't want to follow comma's if they are in a function
  for char in line:
    if char == "(":
      brack_stack += 1 
    elif char == ")":
      brack_stack -= 1 

    if char == "," and brack_stack == 0:
      # new function, clear current and append to list
      funcs.append(current)
      current = ""
    else:
      current += char
  funcs.append(current)
  return funcs


line="[f(x,y),g(y,z),f1(x1,y1)]"
func_list = (getFuncList(line))
print({"Function "+str(x+1): func_list[x] for x in range(len(func_list))}) # make and print the dictionary
# {'Function 1': 'f(x,y)', 'Function 2': 'g(y,z)', 'Function 3': 'f1(x1,y1)'}

可能您只需要为字典键和值使用您想要的内容?它需要使用正则表达式吗?类似地,没有它们可能会更容易。但是,它确实可以工作,在下列情况下会省略部分函数名:line=“[f1#11(x,y),g222(y,z),f1(x1,y1)]“输出是:函数#1:11(x,y)函数#2:g222(y,z)函数#3:f1(x1,y1)下划线(#)之前的任何内容。修改
[a-z0-9]
以包含函数名中可能出现的任何有效字符。例如,
[a-z0-9.]