正規表現でドキュメント文字列を抜き出す実験


今日は昨日に引き続いてドキュメント文字列を正規表現で抜き出す実験をしました。

ソースは以下のようなかんじです。

# -*- coding: utf-8 -*-

import sys
import os
import inspect
import re

#
#
def main(path):
    '''
    '''
    if not os.path.isfile(path):
        return

    try:
        f = file(path, 'r')
        text = f.read()
        f.close()
    except IOError:
        return


    # クラス定義を抜き出す。
    print '---------------'
    expStr = r'class\s+[^\s]+\s*\(*\s*[^\s]*\s*\)*\s*:'
    classExpr = re.compile(expStr)
    print classExpr.findall(text)

    # クラス定義と、ドキュメント文字列を抜き出す。
    print '---------------'
    expStr = r'class\s+[^\s]+\s*\(*\s*[^\s]*\s*\)*\s*:\s*[\'"]{3}[\s\S]*?[\'"]{3}'
    classCommentExpr = re.compile(expStr)
    for s in classCommentExpr.findall(text):
        print s

    # 関数定義を抜き出す。
    print '---------------'
    expStr = r'def\s+[^\s]+\s*\(\s*[\s\w\d,_=\'"]*\s*\)\s*:'
    methodExpr = re.compile(expStr)
    print methodExpr.findall(text)

    # 関数定義と、ドキュメント文字列を抜き出す。
    print '---------------'
    expStr = r'def\s+[^\s]+\s*\(\s*[\s\w\d,_=\'"]*\s*\)\s*:\s*[\'"]{3}[\s\S]*?[\'"]{3}'
    defCommentExpr = re.compile(expStr)
    for s in defCommentExpr.findall(text):
        print s

#
#
if __name__ == '__main__':
    '''
    '''
    if len(sys.argv) <= 1:
        print '*** argument error ***'
    else:
        main(sys.argv[1])

正規表現の文字列、もう少しすっきりと記述できそうですが。。。


それと、(?<=...)という表現を使えば、コメント文字列の部分を1回で取り出せるかも。。。
と思って試してみたんですが、...の部分に可変長の条件(+とか*)を記述することができない
ので、ダメでした(T_T