用于解析其他脚本中的导入的正则表达式?

时间:2016-07-26 17:56:30

标签: python regex

我们在网络共享上有一个大型自定义脚本库(300+),我一直在清理一些已弃用的模块,我需要知道哪些脚本导入了这些,所以我可以将它们指向新的模块。因此,我试图提出一个reg ex,这将允许我搜索任何已弃用的模块。

所以例如,我有2个被弃用的模块(在众多中)被称为sql_dbsql_server,所以我需要报告哪些脚本可能导入这些,但我写的有困难a"赶上所有"在以下场景中找到sql_db的正则表达式(以及我可能忽略的任何其他导入语句):

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),但我怎样才能明确地找到那部分?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

使用\b在&之前查找字边界在(sql_db)之后:

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

这与sql_db1不匹配,因为sql_db不以单词边界结尾 - 它以1结尾。逗号 被视为单词边界,因此它也适用于其他示例。请随意在http://regexr.com/

进行测试