我需要快速地用任何语言编写(或借用)一些东西,自动过滤大量的python源代码,以便删除注释。目标是使目标平台上的代码更紧凑(作为一种附带的逆向工程,甚至稍微有点困难)。我肯定不能修改代码的行为,并且可以忍受一些剩余的注释。我的输入和输出应该是.py文本文件,假设是有效的python2.x(假设:限制为ASCII,我将处理UTF8)。在

严格地说,我确实需要删除A comment starts with a hash character (#) that is not part of a

string literal, and ends at the end of the physical line.

因为python标记器已经为我做了这件事,最后代码以.pyc的形式分发。太糟糕了,因为我清楚地看到了如何干净地执行操作(惟一稍微棘手的部分是python中复杂的syntax of string literal)。在

我的问题是,粗略地看一下我必须过滤的python源代码,会发现它包含了大量的注释,这些注释是由#引入的而不是,而只是字符串文本,没有执行任何有用的任务。它们被明确地保存在.pyc标记化的文件中。他们到处都是,我被告知要促进文档的自动生成和编辑。许多真正是注释的字符串文本都嵌入在函数定义中,例如:def OnForceStatusChoice(self,event):

"""Action when a status is selected"""

self.ExecutionPanel.SetFocus()

另一方面,还有大量的字符串文本是有用的文本,包括要向用户显示的英语文本,以及表的初始化。这使得自动和安全地识别那些真正是字符串文本的值的注释的字符串文本是没有希望的。在

从我的示例来看,大多数真正是注释的字符串文字似乎是由"""引入的(除了少数几个我可以接受的例外),但是我了解足够的python,知道我不能安全地删除所有这些字符串字面值。在

我能安全地(或者在编码风格上有一些明确和合理的假设)假设如果.py文件中忽略#注释的第一件事是字符串文本,那么可以递归地删除它?如果是的话,这个规则是否可以通过忽略(并保留)注释旁边的其他内容而变得更强大?在

从任何行最左边的列开始的任何字符串文本都可以删除?在

任何在语法上与函数定义匹配的字符串(如上面的def)之后开始的字符串文本都可以删除吗?如果是,我如何在语法上精确地定义与函数定义匹配的?在

请回答,就像我不能从随机的字节集合中分辨python一样,这离现实并不遥远。