我們在網絡共享上有一個大型的自定義腳本庫(300+),我一直在清理一些不推薦使用的模塊,我需要知道哪些腳本導入了這些腳本,以便我可以將它們指向新模塊。因此,我試圖想出一個reg ex,這將允許我搜索任何已棄用的模塊。例如,我有2個被棄用的模塊(其中很多)被稱爲sql_db
和sql_server
,所以我需要報告哪些腳本可能會導入這些模塊,但我在寫一個「catch all」正則表達式sql_db
在下列情況下(以及任何其他import語句我可俯瞰):解析其他腳本的導入正則表達式?
from sql_db import *
import sql_db
import os, sql_db, other_module
import sql_db, os
import os,sql_db
我可怕的正則表達式,但我覺得我在這個測試相當接近:
import re
tests = ['import test',
'import sql_db',
'import test, sql_db',
'import sql_db, test',
'from sql_db import *',
'import bmi, sql_db, os, sys',
'from test import os, sys',
'from sql_d import b',
'import a,b,c',
'import sql_db,test,os',
' import sys, sql_db1, test, os',
'import sys,sql_db,test,os']
pat = re.compile('\s*(import|from) (.*)(sql_db)(.*)')
for test in tests:
print test, '| ', pat.match(test) is not None
這幾乎可以工作,但有點過於貪婪,因爲當模塊名爲sql_db1
或在sql_db
之後有任何字符時,它將返回true。
下面是結果(請注意在倒數第二個測試失敗):
import test | False
import sql_db | True
import test, sql_db | True
import sql_db, test | True
from sql_db import * | True
import bmi, sql_db, os, sys | True
from test import os, sys | False
from sql_d import b | False
import a,b,c | False
import sql_db,test,os | True
import sys, sql_db1, test, os | True #should be false but is returning true for sql_db1
import sys,sql_db,test,os | True
我知道那是因爲我有(sql_db)
後的貪婪(.*)
,但我怎麼能做出明確的找到那部分?任何幫助將不勝感激!
測試它你有沒有看過'ast'模塊?您可以使用它來解析這些腳本。使用自定義訪問者,您可以提取所有「導入」和「來自」導入。 – Wombatz
我從來沒有聽說過這個......我會檢查出來,沒有意義重新發明輪子!謝謝。 – crmackey