Desenrollar la sugerencia de utilizar el módulo ast en 2.6 es una buena idea. (También hay el módulo _ast indocumentado en 2.5.) Aquí es código de ejemplo para que
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)
El problema es líneas múltiples. Si ejecuta lo anterior, obtendrá.
string at 1 4 'blah'
string at 4 -1 'multi\nline\nstring'
string at 5 4 u'spam'
Verá que no informa el comienzo de la cadena de varias líneas, solo el final. No hay una buena solución para eso usando las herramientas integradas de Python.
Otra opción es que puede usar mi módulo 'python4ply'. Esta es una definición de gramática para Python para PLY, que es un generador de analizador sintáctico.He aquí cómo usted puede utilizarlo:
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)
El resultado de esto es
string at 1 'blah'
string at 2 'multi\nline\nstring'
string at 5 u'spam'
No hay soporte para la información de la columna. (Hay un código comentado en su mayoría completo para apoyar eso, pero no está completamente probado). De nuevo, veo que no lo necesita. También significa trabajar con el módulo 'compilador' de Python, que es más torpe que el módulo AST.
Aún así, con 30-40 líneas de código debe tener exactamente lo que desea.
si la intención de actuar sobre la información: "nombre de archivo, LineNumber, cadena" a continuación biblioteca lib2to3 de stdlib podría darle algunas ideas sobre cómo refactorizar código Python a gran escala, especialmente de archivos refactor.py lib2to3 /. Puede que solo necesite escribir su propio accesorio y ya está. – jfs