2012-10-14 36 views
12

Có mô-đun nào có thể phân tích cú pháp cấu trúc lại cấu trúc thành mô hình cây không?Làm cách nào để phân tích cú pháp cấu trúc lại trong python?

Docutils hoặc sphinx có thể thực hiện việc này không?

+1

"Đó là tốt hơn" ý kiến ​​mời, vì vậy tôi đã loại bỏ nó khỏi câu hỏi. –

+0

ý của bạn là gì? –

+1

@IonutHulub http://docutils.sourceforge.net/rst.html –

Trả lời

15

Docutils thực sự chứa các công cụ để thực hiện việc này.

Những gì bạn có thể muốn là phân tích cú pháp tại docutils.parsers.rst

Xem this page để biết chi tiết về những gì có liên quan. Ngoài ra còn có một số ví dụ tại docutils/examples.py - đặc biệt là kiểm tra chức năng internals(), có thể là sở thích.

+1

Chỉ cần thêm rằng Docutils là triển khai tham chiếu của reStructuredText và Sphinx được xây dựng trên đầu trang của Docutils. Vì vậy, có, Docutils chắc chắn là công cụ chính xác cho việc này. – Chris

1

Tôi muốn mở rộng khi câu trả lời từ Gareth Latty. "Những gì bạn có thể muốn là trình phân tích cú pháp tại docutils.parsers.rst" là điểm khởi đầu tốt cho câu trả lời, nhưng điều gì sẽ xảy ra tiếp theo? Cụ thể:

Làm cách nào để phân tích cú pháp cấu trúc lại trong python?

Dưới đây là câu trả lời chính xác cho Python 3.6 và docutils 0.14:

import docutils.nodes 
import docutils.parsers.rst 
import docutils.utils 

def parse_rst(text: str) -> docutils.nodes.document: 
    parser = docutils.parsers.rst.Parser() 
    components = (docutils.parsers.rst.Parser,) 
    settings = docutils.frontend.OptionParser(components=components).get_default_values() 
    document = docutils.utils.new_document('<rst-doc>', settings=settings) 
    parser.parse(text, document) 
    return document 

Và tài liệu kết quả có thể được xử lý sử dụng, ví dụ, dưới đây, mà sẽ in tất cả tài liệu tham khảo trong tài liệu:

class MyVisitor(docutils.nodes.NodeVisitor): 

    def visit_reference(self, node: docutils.nodes.reference) -> None: 
     """Called for "reference" nodes.""" 
     print(node) 

    def unknown_visit(self, node: docutils.nodes.Node) -> None: 
     """Called for all other node types.""" 
     pass 

Dưới đây là làm thế nào để chạy nó:

doc = parse_rst('spam spam lovely spam') 
visitor = MyVisitor(doc) 
doc.walk(visitor) 
Các vấn đề liên quan