我们在网络共享上有一个大型自定义脚本库(300+),我一直在清理一些已弃用的模块,我需要知道哪些脚本导入了这些,所以我可以将它们指向新的模块。因此,我试图提出一个reg ex,这将允许我搜索任何已弃用的模块。
所以例如,我有2个被弃用的模块(在众多中)被称为sql_db
和sql_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)
,但我怎样才能明确地找到那部分?任何帮助将不胜感激!
答案 0 :(得分:3)
使用\b
在&之前查找字边界在(sql_db)之后:
\s*(import|from)(.*)\b(sql_db)\b
这与sql_db1不匹配,因为sql_db不以单词边界结尾 - 它以1结尾。逗号 被视为单词边界,因此它也适用于其他示例。请随意在http://regexr.com/
进行测试