2015-06-26 80 views
2

我想找到調用函數名稱的類名。解析Python函數的類名稱

E.g.假設我有:

class foo1(object): 
    bar1() 

class foo2(object): 
    bar2() 

class foo3(object): 
    bar3() 

如果我在尋找BAR2()我想收到:

class foo2(object): 
    bar2() 

我想正則表達式class[\s\S]*bar2\(\)(?!class)的想法是,我會爲另一個類的外觀負先行。不幸的是,它看起來像[\ s \ S]已經匹配所有內容:https://regex101.com/r/kZ7eE5/1

如果「class」只出現一次,而所有其他字符(包括新行和製表符)匹配,是否有匹配的方法?

另外,不要求正則表達式的選擇將被接受。

+2

爲什麼用正則表達式解析Python? – jonrsharpe

+0

只需掃描一行並記住所遇到的最後一個班級定義,您的機會可能會更好。此外,嵌套的類,或方法或方法_with_嵌套類呢? –

+0

我想分析代碼庫。有沒有另一種工具可以解析Python? –

回答

5

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 
+0

這不服務OP的目的,他想返回一個包含某個函數調用的類 –

+0

@PruthviRaj它不完整,但它肯定比使用正則表達式。 –

+0

編輯我的答案覆蓋OP用例 – fferri

0

原因[\s\S]*匹配所有內容是因爲您所說的是任意次數匹配任何空格字符(\s)或任何非空格字符(\S)。你可以在空間和正則表達式中匹配空間。通常。有例外,但Python需要這種形式,所以它應該沒問題。

您可以使用

^class ([\w]+)\([^)]+\): 

演示: https://regex101.com/r/aB9pX4/2

+0

這將返回所有類,但是如果我只想使用bar2()函數的類,該怎麼辦? –

1

下面的代碼打印出包含存儲在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() 
+0

現在嘗試使用它來查找名爲'get_class()'或類似的方法。 –

+0

@tobias_k,我同意這種方法可能不會更好,但我做了什麼OP要求 –

+0

他沒有特別要求這一點,只是想指出,正則表達式appraoch(不只是你的,但一般)不是真的了到工作。這只是一個失敗的例子。 –