Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于在其他脚本中解析导入的正则表达式?_Python_Regex - Fatal编程技术网

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

Python 用于在其他脚本中解析导入的正则表达式?,python,regex,Python,Regex,我们在网络共享上有一个很大的自定义脚本库(300+),我一直在清理一些不推荐的模块,我需要知道哪些脚本导入了这些脚本,以便将它们指向新模块。因此,我试图提出一个reg ex,它允许我搜索任何不推荐使用的模块 例如,我有两个不推荐使用的模块(在许多模块中),分别称为sql\u db和sql\u server,因此我需要报告哪些脚本可能正在导入这些模块,但我在编写一个“catch all”正则表达式时遇到了困难,在以下场景中(以及我可能忽略的任何其他导入语句)可以找到sql\u db: 我对正则表达

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

例如,我有两个不推荐使用的模块(在许多模块中),分别称为
sql\u db
sql\u server
,因此我需要报告哪些脚本可能正在导入这些模块,但我在编写一个“catch all”正则表达式时遇到了困难,在以下场景中(以及我可能忽略的任何其他导入语句)可以找到
sql\u 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\u db1
或在
sql\u db
之后有任何字符时,它将返回true

以下是结果(注意从第二次到最后一次测试中的失败):


我知道这是因为我在
(sql\u db)
之后有贪心的
(.*)
,但是我如何才能让它显式地找到那个部分呢?任何帮助都将不胜感激

使用
\b
查找单词前后的边界(sql\u db):


这将与sql_db1不匹配,因为sql_db不以单词边界结尾,而是以1结尾。逗号被认为是单词的边界,所以它也适用于其他示例。您可以在

上测试它,使用
\b
查找单词前后的边界(sql\u db):


这将与sql_db1不匹配,因为sql_db不以单词边界结尾,而是以1结尾。逗号被认为是单词的边界,所以它也适用于其他示例。请随时在

进行测试您是否查看了
ast
模块?您可以使用它来解析这些脚本。有了一个自定义访客,你可以提取所有的“导入”和“来自”导入。我从来没有听说过这个…我会检查一下,没有意义重新发明轮子!谢谢。你看了
ast
模块了吗?您可以使用它来解析这些脚本。有了一个自定义访客,你可以提取所有的“导入”和“来自”导入。我从来没有听说过这个…我会检查一下,没有意义重新发明轮子!谢谢。@Rawing好电话!已编辑。此功能现在运行良好,谢谢!我错过了文档中的
\b
序列。@画得不错!已编辑。此功能现在运行良好,谢谢!我错过了文档中的
\b
序列。
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
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
\s*(import|from)(.*)\b(sql_db)\b