предложение о том, чтобы использовать модуль 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, который неудобен, чем модуль AST.
Тем не менее, с 30-40 строками кода вы должны иметь именно то, что хотите.
если вы намерены действовать на информацию: «имя файла, номер строки, строки», то библиотека lib2to3 STDLIB в может дать вам некоторые идеи о том, как реорганизовать код Python в больших масштабах, особенно lib2to3/refactor.py файл. Возможно, вам просто нужно написать свой собственный прибор, и все готово. – jfs