reguläre ausdrücke, import, form

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
phpogo
User
Beiträge: 6
Registriert: Montag 10. September 2007, 11:05

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
Benutzeravatar
penguin-p
User
Beiträge: 22
Registriert: Sonntag 19. August 2007, 13:47

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?
phpogo
User
Beiträge: 6
Registriert: Montag 10. September 2007, 11:05

ich möchte nur die elemente in ein array schreiben oder so die auf den regulären ausdruck passen
Benutzeravatar
penguin-p
User
Beiträge: 22
Registriert: Sonntag 19. August 2007, 13:47

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.
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)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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)
Antworten