解析 Python 函数的 Class 名称
Parse Python Function's Class Name
我正在尝试查找调用函数名称的 class 名称。
例如假设我有:
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
如果我正在搜索 bar2() 我想收到:
class foo2(object):
bar2()
我尝试了正则表达式 class[\s\S]*bar2\(\)(?!class)
,我的想法是我会对 class 的另一个出现进行否定预测。不幸的是,[\s\S] 似乎已经匹配了所有内容:https://regex101.com/r/kZ7eE5/1
如果 "class" 在匹配所有其他字符(包括换行符和制表符)时只出现一次,有没有办法匹配?
也接受不需要正则表达式的替代方案。
[\s\S]*
匹配所有内容的原因是因为您要匹配任何 space 字符 (\s
) 或任何非 space 字符 (\S
) 任意次数。您可以在正则表达式中将 space 与 space 匹配。通常。也有例外,但是 python 需要这种形式,所以应该没问题。
您可以使用
^class ([\w]+)\([^)]+\):
以下代码打印 class,其中包含存储在 function
变量中的方法调用。这是您需要执行的操作:
import re
data = """
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
"""
classes = re.findall('(class[\s\S]*?)(?=class|$)',data)
function = "bar2()"
for x in classes:
if function in x:
matched_class = x
break
print(matched_class)
输出:
class foo2(object):
bar2()
RE 方法可能容易出错(Python 语言的表达能力比 RE 识别的常规语言的表达能力更强)。
使用Python的ast
模块解析Python代码:
code = '''
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
'''
>>> import ast
>>> tree = ast.parse(code)
>>> for i in tree.body:
... if isinstance(i, ast.ClassDef):
... print('class: %s' % i.name)
...
class: foo1
class: foo2
class: foo3
>>>
您还可以做很多其他事情,请查看 https://greentreesnakes.readthedocs.org/en/latest/
上的文档
编辑:更完整的示例:
>>> for i in tree.body:
... if isinstance(i, ast.ClassDef):
... for j in i.body:
... if isinstance(j, ast.Expr):
... print('found a call to function %s in class %s' % (j.value.func.id, i.name))
...
found a call to function bar1 in class foo1
found a call to function bar2 in class foo2
found a call to function bar3 in class foo3
我正在尝试查找调用函数名称的 class 名称。
例如假设我有:
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
如果我正在搜索 bar2() 我想收到:
class foo2(object):
bar2()
我尝试了正则表达式 class[\s\S]*bar2\(\)(?!class)
,我的想法是我会对 class 的另一个出现进行否定预测。不幸的是,[\s\S] 似乎已经匹配了所有内容:https://regex101.com/r/kZ7eE5/1
如果 "class" 在匹配所有其他字符(包括换行符和制表符)时只出现一次,有没有办法匹配?
也接受不需要正则表达式的替代方案。
[\s\S]*
匹配所有内容的原因是因为您要匹配任何 space 字符 (\s
) 或任何非 space 字符 (\S
) 任意次数。您可以在正则表达式中将 space 与 space 匹配。通常。也有例外,但是 python 需要这种形式,所以应该没问题。
您可以使用
^class ([\w]+)\([^)]+\):
以下代码打印 class,其中包含存储在 function
变量中的方法调用。这是您需要执行的操作:
import re
data = """
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
"""
classes = re.findall('(class[\s\S]*?)(?=class|$)',data)
function = "bar2()"
for x in classes:
if function in x:
matched_class = x
break
print(matched_class)
输出:
class foo2(object):
bar2()
RE 方法可能容易出错(Python 语言的表达能力比 RE 识别的常规语言的表达能力更强)。
使用Python的ast
模块解析Python代码:
code = '''
class foo1(object):
bar1()
class foo2(object):
bar2()
class foo3(object):
bar3()
'''
>>> import ast
>>> tree = ast.parse(code)
>>> for i in tree.body:
... if isinstance(i, ast.ClassDef):
... print('class: %s' % i.name)
...
class: foo1
class: foo2
class: foo3
>>>
您还可以做很多其他事情,请查看 https://greentreesnakes.readthedocs.org/en/latest/
上的文档编辑:更完整的示例:
>>> for i in tree.body:
... if isinstance(i, ast.ClassDef):
... for j in i.body:
... if isinstance(j, ast.Expr):
... print('found a call to function %s in class %s' % (j.value.func.id, i.name))
...
found a call to function bar1 in class foo1
found a call to function bar2 in class foo2
found a call to function bar3 in class foo3