đề xuất của thư giãn về việc sử dụng mô-đun ast trong 2.6 là tốt nhất. (Cũng có mô-đun _ast không có giấy tờ trong 2.5.) Đây là mã ví dụ cho rằng
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)
Vấn đề là chuỗi nhiều dòng. Nếu bạn chạy trên, bạn sẽ nhận được.
string at 1 4 'blah'
string at 4 -1 'multi\nline\nstring'
string at 5 4 u'spam'
Bạn thấy rằng nó không báo cáo sự bắt đầu của chuỗi nhiều dòng, chỉ kết thúc. Không có giải pháp tốt cho việc sử dụng các công cụ Python dựng sẵn.
Một tùy chọn khác là bạn có thể sử dụng mô-đun 'python4ply' của mình. Đây là định nghĩa ngữ pháp cho Python cho PLY, là trình tạo trình phân tích cú pháp.Dưới đây là cách bạn có thể sử dụng nó:
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)
Kết quả từ này là
string at 1 'blah'
string at 2 'multi\nline\nstring'
string at 5 u'spam'
Không có sự hỗ trợ cho thông tin cột. (Có một số mã nhận xét gần như hoàn toàn đã được nhận xét để hỗ trợ điều đó, nhưng nó chưa được kiểm tra đầy đủ.) Sau đó, một lần nữa, tôi thấy bạn không cần nó. Nó cũng có nghĩa là làm việc với mô-đun 'trình biên dịch' của Python, nó phức tạp hơn mô-đun AST.
Tuy nhiên, với 30-40 dòng mã, bạn nên có chính xác những gì bạn muốn.
nếu bạn có ý định hành động trên thông tin: "filename, linenumber, chuỗi", sau đó thư viện lib2to3 stdlib của thể cung cấp cho bạn một số ý tưởng về cách cấu trúc lại mã Python trên quy mô lớn, đặc biệt là lib2to3/refactor.py tập tin. Bạn có thể chỉ cần viết lịch thi đấu của riêng bạn cho nó và bạn đã hoàn thành. – jfs