クロージャによるタグパーサー

呼称: クロージャによるタグパーサー
目的: 任意の区切り文字でタグをパースする(タグの入れ子は不可)
特徴: クロージャを生成する
用例: はてなブックマークのタグを解析する
備考: クロージャの勉強にも良いかも?

2009/10/09 空白文字類を除外するように変更しました。

XML 系ライブラリを読めばもっと良い方法がありそうな気がしますが、取りあえずシンプルに動くものを作ってみました。バグってましたらツッコミください。Python クックブックを読んでいたら、クロージャの説明が面白くて、クロージャを使ってみたくなったというのが本音だったりします(^ ^;;

#!/usr/bin/env python

import re
whitespace = re.compile('^\s*$')

def make_my_parser(start, end):
    def my_parser(s):
        l = []
        t = s[s.index(start):].split(start)
        for i in t:
            if end in i:
                p = i[0:i.index(end)]
                if not whitespace.match(p):
                    l.append(p)
        return l
    return my_parser

def main():
    p = make_my_parser('[', ']')
    q = make_my_parser('(', ')')
    
    x = '[list] [touple[iter] [ ] dictionary [python module of the week]'
    print 'original: ' + x
    print 'tag list: ' + str(p(x))
    y = 'closer) ([plone]) zope) (((django)(pylucene) (idle)'
    print 'original: ' + y
    print 'tag list: ' + str(q(y))
    
if __name__ == '__main__':
    main()

実行結果。

$ python my_parser.py
original: [list] [touple[iter] [ ] dictionary [python module of the week]
tag list: ['list', 'iter', 'python module of the week']
original: closer) ([plone]) zope) (((django)(pylucene) (idle)
tag list: ['[plone]', 'django', 'pylucene', 'idle']

リファレンス:
第 3 回 再帰定義と高階関数