expresiones regulares para analizar las declaraciones de importación en Python

¿Puede alguien ayudarme a escribir expresiones regulares para obtener módulos de la línea de código fuente de python?

from abc.lmn import pqr from abc.lmn import pqr as xyz import abc import abc as xyz 

tiene 3 sub partes en ella

 [from(\s)(\s)] --> get module if this part exist import(\s) --> get module [(\s)as(\s)] --> ignore if this part exist 

algo como esto

 :?[from(\s)(\s)]import(\s):?[(\s)as(\s)] 

Parece que podrías hacer el de opcional y la importación requerida en
Al mismo tiempo ignorando el como .

(?m)^(?:from[ ]+(\S+)[ ]+)?import[ ]+(\S+)[ ]*$

https://regex101.com/r/fmoAuh/1

Explicado

  (?m) # Modifiers: multi-line ^ # Beginning of line (?: # Optional from from [ ]+ ( \S+ ) # (1), from  [ ]+ )? import [ ]+ # Required import ( \S+ ) # (2), import  [ ]* $ # End of line 

O, si desea hacer coincidir el como pero no quiere capturar nada, use esto.

(?m)^(?:from[ ]+(\S+)[ ]+)?import[ ]+(\S+)(?:[ ]+as[ ]+\S+)?[ ]*$

https://regex101.com/r/xFtey5/1

Expandido

  (?m) # Modifiers: multi-line ^ # Beginning of line (?: # Optional from from [ ]+ ( \S+ ) # (1), from  [ ]+ )? import [ ]+ # Required import ( \S+ ) # (2), import  (?: # Optional as [ ]+ as [ ]+ \S+ #  )? [ ]* $ 

En lugar de usar una expresión regular, el uso de la biblioteca Python integrada en ast puede ser un mejor enfoque. https://docs.python.org/2/library/ast.html Puede usarlo para analizar la syntax de python.

 import ast import_string = """from abc.lmn import pqr from abc.lmn import pqr as xyz import abc import abc as xyz""" modules = [] for node in ast.iter_child_nodes(ast.parse(import_string)): if isinstance(node, ast.ImportFrom): if not node.names[0].asname: # excluding the 'as' part of import modules.append(node.module) elif isinstance(node, ast.Import): # excluding the 'as' part of import if not node.names[0].asname: modules.append(node.names[0].name) 

eso le dará [‘abc.lmn’, ‘abc’] y es bastante fácil de modificar si desea obtener otra información.