2016-07-26 40 views
0

我們在網絡共享上有一個大型的自定義腳本庫(300+),我一直在清理一些不推薦使用的模塊,我需要知道哪些腳本導入了這些腳本,以便我可以將它們指向新模塊。因此,我試圖想出一個reg ex,這將允許我搜索任何已棄用的模塊。例如,我有2個被棄用的模塊(其中很多)被稱爲sql_dbsql_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)後的貪婪(.*),但我怎麼能做出明確的找到那部分?任何幫助將不勝感激!

+2

測試它你有沒有看過'ast'模塊?您可以使用它來解析這些腳本。使用自定義訪問者,您可以提取所有「導入」和「來自」導入。 – Wombatz

+0

我從來沒有聽說過這個......我會檢查出來,沒有意義重新發明輪子!謝謝。 – crmackey

回答

3

使用\b尋找一個字邊界(sql_db)後&前:

\s*(import|from)(.*)\b(sql_db)\b 

這不會sql_db1匹配,因爲sql_db沒有一個字邊界結束 - 它在1逗號結束考慮了單詞邊界,所以它也適用於其他示例。隨時在http://regexr.com/

+0

@Rawing良好的呼喚!編輯。 –

+0

現在完美,謝謝!我錯過了文檔中的「\ b」序列。 – crmackey