取得Python代码段的正则表达式?
如:
def aa(i):
print i
a=[1,2,3]
b=2
c=3
能识别出起始位def aa(i):
和结束位" a=[1,2,3]"?
[解决办法]
像Python对语法这么要求严格的我觉得就不要用正则了,效率不高。直接用判断就可以了,我写了个识别顶级函数的,抛砖引玉:
s = r'''def aa(i): print i a=[1,2,3]b=2c=3def a(): print\ 'w''''def findFunc(s): result = [] begin = False def show(x): print '\n***Function***:\n', '\n'.join(x) ss = s.split('\n') for i,row in enumerate(ss): if len(row)==0: continue if begin: if row.startswith(' '): result.append(row) elif ss[i-1].endswith('\\'): result.append(row) else: show(result) begin = False result = [] if row.startswith('def '): begin = True result.append(row) show(result)findFunc(s)
[解决办法]
我觉得应该用ast 才能把他正确解释出来
e.g.,
import ast
class V(ast.NodeVisitor):
def visit_FunctionDef(self, node):
print 'def %s' % (node.name)
s='''
def aa(i):
print i
a = [ 1, 2, 3]
b = 2
c = 3
'''
t = ast.parse(s)
V().visit(t)
"""gives
def aa
"""
其馀的LZ再看看 ast用法
[解决办法]
像有些开头""" ( [{ 未完成,写到下行就是自由格式,不好用正则,用字符处理也很麻烦,可以试试tokenzie模块,会变成下面的东西,然后先搜连续出现的def aa后开始计算配对的indent和dedent,按lz的例子就单纯一组,行2缩进一次到了行5抵消,应该就是函数尾了...
1,0-1,3:NAME'def'
1,4-1,6:NAME'aa'
1,6-1,7:OP'('
1,7-1,8:NAME'i'
1,8-1,9:OP')'
1,9-1,10:OP':'
1,10-1,11:NEWLINE'\n'
2,0-2,4:INDENT' '
2,4-2,9:NAME'print'
2,10-2,11:NAME'i'
2,11-2,12:NEWLINE'\n'
3,4-3,5:NAME'a'
3,6-3,7:OP'='
3,8-3,9:OP'['
3,10-3,11:NUMBER'1'
3,11-3,12:OP','
3,13-3,14:NUMBER'2'
3,14-3,15:OP','
3,16-3,17:NUMBER'3'
3,17-3,18:OP']'
3,18-3,19:NEWLINE'\n'
4,0-4,1:NL'\n'
5,0-5,0:DEDENT''
5,0-5,1:NAME'b'
5,2-5,3:OP'='
5,4-5,5:NUMBER'2'
5,8-5,9:NEWLINE'\n'
6,0-6,1:NAME'c'
6,2-6,3:OP'='
6,4-6,5:NUMBER'3'
6,5-6,6:NEWLINE'\n'
7,0-7,0:ENDMARKER''
>Exit code: 0