Mar-16-2020, 11:17 AM
To also check if all parameter in a Python function is valid then it's like the famous regex problem from email.
So this the is fully RFC 822 compliant regex,i have never needed to use that regex to eg extract email from text.
So with the regex i posted it will find both last two examples.
With the not valid one will get
So if i test this it look like this:
So this the is fully RFC 822 compliant regex,i have never needed to use that regex to eg extract email from text.
So with the regex i posted it will find both last two examples.
import re text = '''\ def my_game(): print('Game running') def 123 def foo(arg): pass def Bar(args*, kwargs**): pass hello def is nice def () wrong def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]): pass def foobar( **abc, *def ): pass''' # Make list of match def_name = re.findall(r"def\s(\w+)\(.*", text) def_line = re.findall(r"def\s\w+\(.*", text) # Iterate over matches group() or group(1) matches = re.finditer(r"def\s(\w+)\(.*", text) for match in matches: print(match.group(1))
Output:my_game
foo
Bar
spam
foobar
>>> def_line ['def my_game():', 'def foo(arg):', 'def Bar(args*, kwargs**):', 'def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]):', 'def foobar( **abc, *def ):']I would not try to write a regex for all cases,could as @Gribouillis mention step it up with adding
pass
and try to run the function.With the not valid one will get
SyntaxError
,valid one will return None
or other error like NameError
.So if i test this it look like this:
>>> check = def_line[-1] >>> check 'def foobar( **abc, *def ):' >>> check = check.replace(':', ':pass') >>> exec(check) Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "<string>", line 1 def foobar( **abc, *def ):pass ^ SyntaxError: invalid syntaxSo with the valid ones:
>>> check = def_line[1] >>> check = check.replace(':', ':pass') >>> check 'def foo(arg):pass' >>> repr(exec(check)) 'None' >>> >>> check = def_line[-2] >>> check = check.replace(':', ':pass') >>> check 'def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]):pass' >>> exec(check) Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "<string>", line 1, in <module> NameError: name 'dividend' is not defined