Извлечь текст в скобках и сохранить в словаре - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь разделить все функции в квадратных скобках и сохранить их в словаре.Однако выход удаляет закрывающую скобку со всех выходов, кроме последнего.

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)

Какое регулярное выражение мне следует использовать?

Далее, как я могу сохранить эти выходные данные в словаре?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Если вам не нужно использовать регулярные выражения, это может быть проще сделать.За этим легко следовать, он просто перемещается по строке и помещает строки функций в список и отслеживает скобки, поэтому функции с несколькими запятыми будут обрабатываться очень хорошо.

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)'}
0 голосов
/ 11 мая 2018

Мое общее правило для извлечения данных - вызывать 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}')

Я использую одно простое регулярное выражение для извлечения данных из [] и другое для извлечения вызовов отдельных функций.

...