Подтвердить что ты не робот

Как разобрать реструктурированный текст в python?

Есть ли какой-нибудь модуль, который может анализировать реструктурированный текст в древовидной модели?

Может ли docutils или сфинкс сделать это?

4b9b3361

Ответ 1

Docutils действительно содержит инструменты для этого.

Возможно, вам нужен парсер в docutils.parsers.rst

Подробнее о том, что задействовано, см. на этой странице. Есть также несколько примеров на docutils/examples.py - особенно проверьте функцию internals(), которая, вероятно, представляет интерес.

Ответ 2

Я хотел бы продолжить ответ гарета Латти. "То, что вы, вероятно, хотите, - это парсер в docutils.parsers.rst" - хорошая отправная точка ответа, но что дальше? А именно:

Как разобрать реструктурированный текст в python?

Ниже приведен точный ответ для Python 3.6 и документированных версий 0.14:

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

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

И полученный документ можно обработать, используя, например, ниже, что будет печатать все ссылки в документе:

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

Вот как это сделать:

doc = parse_rst('spam spam lovely spam')
visitor = MyVisitor(doc)
doc.walk(visitor)