Home > Software design >  Regex Pattern to find arguments passed into a function
Regex Pattern to find arguments passed into a function

Time:11-22

For a project, I am trying to read through a python file and keep a list of all the variable being used within a certain function. I am reading through the lines in the python file in string format and then focusing on a line where starting with "def". For the purpose of this example pretend we have the following line identified:

def func(int_var:int,float_var=12.1,string_var=foo()):

I want to use regex or any other method to grab the values within this function declaration.

I want to grab the string "int_var:int,float_var=12.1,string_var=foo()", and later split it based on the commas to get ["int_var:int","float_var=12.1","string_var=foo()"]

I am having a lot of trouble being able to isolate the items between the parenthesis corresponding to 'func'.

Any help creating a regex pattern would be greatly appreciated!

CodePudding user response:

Instead of regex, it is much easier and far more robust to use the ast module:

import ast
s = """
def func(int_var:int,float_var=12.1,string_var=foo()):
   pass
"""
def form_sig(sig):
   a = sig.args
   d = [f'{ast.unparse(a.pop())}={ast.unparse(j)}' for j in sig.defaults[::-1]][::-1]
   v_arg = [] if sig.vararg is None else [f'*{sig.vararg.arg}']
   kwarg = [] if sig.vararg is None else [f'*{sig.kwark.arg}']
   return [*map(ast.unparse, a), *d, *v_arg, *kwarg]

f = [{'name':i.name, 'sig':form_sig(i.args)} for i in ast.walk(ast.parse(s)) 
        if isinstance(i, ast.FunctionDef)] 

Output:

[{'name': 'func', 'sig': ['int_var: int', 'float_var=12.1', 'string_var=foo()']}]

CodePudding user response:

func_pattern = re.compile(r'^\s*def\s(?P<name>[A-z_][A-z0-9_] )\(?P<args>.*)\):$')

match = func_pattern.match('def my_func(arg1, arg2)')
func_name = match.group('name') # my_func
func_args = match.group('args').split(',') # ['arg1', 'arg2']
  • Related