Hallo, ich bin neu auf dem gebiet Python, habe vorher nur mit php usw. gearbeitet.
ich möchte aus einer zeile in eine py-datei alle importierten module isolieren mit regulären ausdrücken. wie kann ich das machen?
import x
from asdasd import ssss
ich brauche die module. helft mir bitte. danke
reguläre ausdrücke, import, form
Ich versteh deine Frage ehrlich gesagt nicht.
Möchtest du Module importieren deren Namen auf einen regulären Ausdruck passen?
Oder möchtest du von allen importierten Modulen diejenigen finden, die auf einen regulären Ausdruck passen?
Oder möchtest du was anderes?
Möchtest du Module importieren deren Namen auf einen regulären Ausdruck passen?
Oder möchtest du von allen importierten Modulen diejenigen finden, die auf einen regulären Ausdruck passen?
Oder möchtest du was anderes?
Code: Alles auswählen
>>> import re
>>> liste = ["a", "b", "c", "1", "2", "3"]
>>> c = re.compile("[a-z]")
>>> res = [e for e in liste if c.match(e)]
>>> res
['a', 'b', 'c']
Das kannst du auch auf Namen des globalen Namensraums anwenden:
Code: Alles auswählen
>>> globals().keys()
['c', 'e', 're', '__builtins__', 'res', 'liste', '__name__', '__doc__']
>>> liste = globals().keys()
>>> c = re.compile("__[a-zA-Z0-9_]*__")
>>> res = [e for e in liste if c.match(e)]
>>> res
['__builtins__', '__name__', '__doc__']
Ich habe es so verstanden das ein regulärer Ausdruck gesucht ist um aus Python-Quelltext die Namen der importierten Module zu extrahieren.
Ich denke reguläre Ausdrücke sind da nur bedingt tauglich, jedenfalls wenn man alle möglichen Formen inklusive Aliasnamen und Zeilenfortsetzung mittels Backslash berücksichtigen möchte und auch sicherstellen möchte, dass falsche Treffer in Zeichenketten und Kommentaren ausgeschlossen werden.
Ich würde das `astng`-Modul von Logilab benutzen.
Ich denke reguläre Ausdrücke sind da nur bedingt tauglich, jedenfalls wenn man alle möglichen Formen inklusive Aliasnamen und Zeilenfortsetzung mittels Backslash berücksichtigen möchte und auch sicherstellen möchte, dass falsche Treffer in Zeichenketten und Kommentaren ausgeschlossen werden.
Ich würde das `astng`-Modul von Logilab benutzen.
Code: Alles auswählen
from logilab.astng import Import, From
from logilab.astng.builder import ASTNGBuilder
def main():
builder = ASTNGBuilder()
ast = builder.file_build('test.py')
modules = set()
for node in ast.nodes_of_class((Import, From)):
if isinstance(node, Import):
modules.update(set(name for name, alias in node.names))
elif isinstance(node, From):
modules.add(node.modname)
else:
assert False
print sorted(modules)
Oder eben direkt das compiler-Modul:BlackJack hat geschrieben:Ich würde das `astng`-Modul von Logilab benutzen.
Code: Alles auswählen
import compiler
class ImportVisitor(compiler.visitor.ASTVisitor):
def __init__(self):
self.modules = set()
compiler.visitor.ASTVisitor.__init__(self)
def visitFrom(self, from_node):
self.modules.add(from_node.modname)
def visitImport(self, import_node):
self.modules.update(n[0] for n in import_node.names)
def main():
ast = compiler.parse('import foo\nfrom bar import rab')
# oder ast = compiler.parseFile('foo.py')
visitor = ImportVisitor()
compiler.walk(ast, visitor)
print sorted(visitor.modules)