使用docutils从recostructedText中提取代码指令

2024-09-27 21:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从recostructedText字符串中的代码指令中逐字提取源代码。在

下面是我第一次尝试这样做,但我想知道是否有更好的(即更健壮、更一般、更直接)的方法。在

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

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');
    }

'''

为了得到这两个代码块,我可以这么做

^{pr2}$

现在源代码是一个列表,其中只有来自两个代码块的逐字源代码。如果需要,我也可以使用childattributes属性来找出代码类型。在

它能起作用,但是有更好的方法吗?在


Tags: 方法字符串代码文本源代码footitlemy
2条回答

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

节点上有一个“遍历”方法(document/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]

可以进一步简化如下:

source_code = [block.astext() for block in doctree.traverse(nodes.literal_block)
               if 'code' in block.attributes['classes']]

相关问题 更多 >

    热门问题