编程语言
首页 > 编程语言> > python – 使用docutils从restructuredtext中提取代码指令中的代码

python – 使用docutils从restructuredtext中提取代码指令中的代码

作者:互联网

我想从重构文本字符串中的代码指令中逐字提取源代码.

以下是我第一次尝试这样做,但我想知道是否有更好的(即更强大,更通用或更直接)的方式.

假设我在python中将以下第一个文本作为字符串:

s = '''

My title
========

Use this to square a number.

.. code:: python

   def square(x):
       return x**2

and here is some javascript too.

.. code:: javascript

    foo = function() {
        console.log('foo');
    }

'''

要获得两个代码块,我可以做到

from docutils.core import publish_doctree

doctree = publish_doctree(s)
source_code = [child.astext() for child in doctree.children 
if 'code' in child.attributes['classes']]

现在source_code是一个列表,只包含两个代码块的逐字源代码.如果需要,我也可以使用child的attributes属性来查找代码类型.

它完成了这项工作,但还有更好的方法吗?

解决方法:

您的解决方案只会在文档的顶层找到代码块,如果类“代码”用于其他元素(不太可能,但可能),它可能会返回误报.我还会检查在其.tagname属性中指定的元素/节点的类型.

节点上有一个“遍历”方法(文档/ doctree只是一个特殊节点),它对文档树进行完全遍历.它将查看文档中的所有元素,并仅返回与用户指定的条件匹配的元素(返回布尔值的函数).这是如何做:

def is_code_block(node):
    return (node.tagname == 'literal_block'
            and 'code' in node.attributes['classes'])

code_blocks = doctree.traverse(condition=is_code_block)
source_code = [block.astext() for block in code_blocks]

标签:python,restructuredtext,docutils
来源: https://codeday.me/bug/20190624/1275703.html