Sugerowana przez unwind sugestia użycia modułu ast w wersji 2.6 jest bardzo dobra. (Jest też nieudokumentowane moduł _ast w 2.5.) Oto przykładowy kod dla tej
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)
Problem polega na multilinii struny. Jeśli uruchomisz powyższe, dostaniesz.
string at 1 4 'blah'
string at 4 -1 'multi\nline\nstring'
string at 5 4 u'spam'
Widzisz, że nie zgłasza początku ciągu wielowierszowego, tylko koniec. Nie ma na to dobrego rozwiązania za pomocą wbudowanych narzędzi Pythona.
Inną opcją jest możliwość korzystania z mojego modułu "python4ply". To jest definicja gramatyki dla Pythona dla PLY, która jest generatorem analizatora składni.Oto w jaki sposób można go używać:
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)
Wyjście z tego jest
string at 1 'blah'
string at 2 'multi\nline\nstring'
string at 5 u'spam'
Nie ma wsparcia dla kolumny informacji. (Jest tam w większości kompletny skomentowany kod, ale nie jest w pełni przetestowany.) Potem znowu widzę, że go nie potrzebujesz. Oznacza to również pracę z modułem "kompilatora" Pythona, który jest bardziej złożony niż moduł AST.
Mimo to, z 30-40 liniami kodu, powinieneś mieć dokładnie to, co chcesz.
jeśli zamiar działać na informacjach: „nazwy pliku, LineNumber, string”, a następnie lib2to3 biblioteka stdlib za może dać ci kilka pomysłów na to, jak byłaby kodu Pythona na dużą skalę, zwłaszcza lib2to3/refactor.py pliku. Być może wystarczy tylko napisać dla niego własne urządzenie i gotowe. – jfs