1

给定一个s包含(语法上有效的)Python 源代码的字符串,我怎样才能拆分s成一个数组,其元素是对应于 Python 中的“语句”的字符串s

我在“陈述”周围加上了吓人的引号,因为这个术语并没有准确地捕捉到我正在寻找的东西。与其试图提出更准确的措辞,不如举一个例子。比较以下两个 ipython 交互:

In [1]: if 1 > 0:
......: pass
......: 

In [2]: if 1 > 0
  File "<ipython-input-1082-0b411f095922>", line 1
    if 1 > 0
            ^
SyntaxError: invalid syntax

在第一次交互中,在第一个[RETURN]语句之后,ipython 会if 1 > 0:毫无异议地处理输入,即使它仍然不完整(即它不是完整的 Python 语句)。相比之下,在第二次交互中,输入不仅不完整(在这个意义上),而且 ipython 也不能接受。

作为第二个更完整的示例,假设该文件foo.py包含以下 Python 源代码:

def print_vertically(s):
    '''A pretty useless procedure.

    Prints the characters in its argument one per line.  
    '''

    for c in s:
        print c

greeting = ('hello '
            'world'.
            upper())

print_vertically(greeting)

现在,如果我运行以下片段,具有所需的split_python_source功能:

src = open('foo.py').read()
for i, s in enumerate(split_python_source(src)):
    print '%d. >>>%s<<<' % (i, s)

输出如下所示:

0. >>>def print_vertically(s):<<<
1. >>>    '''A pretty useless procedure.

    Prints the characters in its argument one per line.
    '''<<<
2. >>>    for c in s:<<<
3. >>>        print c<<<
4. >>>greeting = ('hello '
            'world'.
            upper())<<<
5. >>>print_vertically(greeting)<<<

如您所见,在这种拆分中,for c in s:(例如)被分配给它自己的项目,而不是成为某些“复合语句”的一部分。

事实上,我没有关于如何进行拆分的非常精确的规范,只要它是“在关节处”完成的(就像 ipython 那样)。

4

1 回答 1

-1

我不熟悉 Python 词法分析器的内部结构(尽管几乎可以肯定 SO 上有很多人是 :),但我猜你基本上是在寻找行,但有一个重要的例外:可以跨越的成对的开闭分隔符多行。

作为一个快速而肮脏的第一遍,您可以从在换行符上拆分一段代码的东西开始,然后您可以合并发现包含成对分隔符的连续行 - 括号()、大括号{}、方括号[]和引号''''' '''是那些浮现在脑海中的。

于 2013-08-14T23:17:31.110 回答