unwind建议在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)
问题是多行字符串。如果你运行以上你会得到。在
^{pr2}$
您可以看到它不报告多行字符串的开始,只报告结束。使用内置的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, "")
#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行代码,你应该得到你想要的。在