Abwickelstation Anregung des ast Modul in 2.6 zu verwenden, ist ein guter. (Es gibt auch die undokumentierten _ast Modul in 2.5.) Hier ist Beispielcode für das
code = """a = 'blah'
b = '''multi
line
string'''
c = u"spam"
"""
import ast
root = ast.parse(code)
class ShowStrings(ast.NodeVisitor):
def visit_Str(self, node):
print "string at", node.lineno, node.col_offset, repr(node.s)
show_strings = ShowStrings()
show_strings.visit(root)
Das Problem mehrzeilige Strings ist. Wenn Sie das oben genannte ausführen, werden Sie erhalten.
string at 1 4 'blah'
string at 4 -1 'multi\nline\nstring'
string at 5 4 u'spam'
Sie sehen, dass es nicht den Anfang der mehrzeiligen Zeichenfolge meldet, nur das Ende. Es gibt keine gute Lösung für das Verwenden der integrierten Python-Tools.
Eine weitere Option ist, dass Sie mein 'python4ply' Modul verwenden können. Dies ist eine Grammatikdefinition für Python für PLY, die ein Parser-Generator ist.Hier ist, wie Sie könnte es verwenden:
import compiler
import compiler.visitor
# from python4ply; requires the ply parser generator
import python_yacc
code = """a = 'blah'
b = '''multi
line
string'''
c = u"spam"
d = 1
"""
tree = python_yacc.parse(code, "<string>")
#print tree
class ShowStrings(compiler.visitor.ASTVisitor):
def visitConst(self, node):
if isinstance(node.value, basestring):
print "string at", node.lineno, repr(node.value)
visitor = ShowStrings()
compiler.walk(tree, visitor)
Die Ausgabe von dieser ist
string at 1 'blah'
string at 2 'multi\nline\nstring'
string at 5 u'spam'
Es gibt keine Unterstützung für Spalteninformationen. (Es gibt einige größtenteils vollständig auskommentierten Code, um das zu unterstützen, aber es ist nicht vollständig getestet.) Andererseits, ich sehe, dass Sie es nicht brauchen. Es bedeutet auch, mit Pythons "Compiler" -Modul zu arbeiten, das unhandlicher ist als das AST-Modul.
Noch, mit einer 30-40 Zeilen Code sollten Sie genau das haben, was Sie wollen.
, wenn Sie darauf bedacht, den Informationen zu handeln: „Dateiname, Zeilennummer, string“ dann stdlib der lib2to3 Bibliothek könnte Ihnen einige Ideen geben, wie Python-Code in großem Maßstab, Refactoring, insbesondere lib2to3/refactor.py Datei. Sie müssen vielleicht nur Ihr eigenes Gerät dafür schreiben und Sie sind fertig. – jfs