откатить предложение использовать модуль ast в 2.6 - хороший вариант. (Есть также недокументированный модуль _ast в 2.5.) Вот пример кода для этого
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)
Проблема в многострочных строках. Если вы запустите выше, вы получите.
string at 1 4 'blah'
string at 4 -1 'multi\nline\nstring'
string at 5 4 u'spam'
Вы видите, что он не сообщает о начале многострочной строки, только о конце. Нет хорошего решения для этого, используя встроенные инструменты Python.
Другой вариант заключается в том, что вы можете использовать мой модуль python4ply . Это грамматическое определение для Python для PLY , который является генератором парсера. Вот как это можно использовать:
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)
Выход из этого
string at 1 'blah'
string at 2 'multi\nline\nstring'
string at 5 u'spam'
Нет поддержки информации о столбцах. (Существует некоторый в основном полный закомментированный код для поддержки этого, но он не полностью протестирован.) Опять же, я вижу, что он вам не нужен. Это также означает работу с модулем Python 'compiler', который более громоздок, чем модуль AST.
Тем не менее, с 30-40 строками кода у вас должно быть именно то, что вы хотите.