Seite 1 von 1

reguläre ausdrücke, import, form

Verfasst: Montag 10. September 2007, 11:08
von phpogo
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

Verfasst: Montag 10. September 2007, 13:10
von penguin-p
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?

Verfasst: Montag 10. September 2007, 14:09
von phpogo
ich möchte nur die elemente in ein array schreiben oder so die auf den regulären ausdruck passen

Verfasst: Montag 10. September 2007, 14:20
von penguin-p

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']
Ganz allgemein für eine Liste von Strings.
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__']
Falls das das ist, was du wolltest. Ansonsten musst du deine Frage nochmal genauer formulieren.

Verfasst: Montag 10. September 2007, 14:35
von BlackJack
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.

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)

Verfasst: Montag 10. September 2007, 15:05
von Trundle
BlackJack hat geschrieben:Ich würde das `astng`-Modul von Logilab benutzen.
Oder eben direkt das compiler-Modul:

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)