pythonの正規表現で日本語を扱う

先日、正規表現が使えるようになってきたと書いたものの、今まで日本語に対して正規表現を使うのは、どうせ上手く動かないだろうという様な先入観で使っていなかったのですが、調べてみるとただの食わず嫌いだった事が解りました。

利用シーンは色々考えられると思うのですが、例えば日本語文書中の単位付き数詞(100g、20個等)から数値と単位を両方抜き出すという処理を考えます。折角なので数値・単位共に半角全角文字がどちらも使われていて、正規表現が使いにくそうな状況を想定します。結論から言うとunicode文字列を使えばこのような状況でも上手く正規表現を使う事が出来ます。

使い方は簡単でパターンと検索対象の文字列をunicodeで用意し、searchやmatch等を呼ぶ際にunicodeフラグを指定すればOKです。unicodeフラグは省略形のre.Uも用意されています。先ほど想定した問題に対する正規表現を書くと以下のようになるでしょうか。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re

s1 = u'100g'
s2 = u'20個'
regex = u'(?P[\d]+)(?P[\w]+)'
match = re.search(regex, s1, re.U)         # re.Uでunicodeフラグを指定
print match.group('num').encode('utf-8')   # 100
print match.group('unit').encode('utf-8')  # g

match = re.search(regex, s2, re.U)
print match.group('num').encode('utf-8')   # 20
print match.group('unit').encode('utf-8')  # 個

[0-9]を表す\dですが、unicodeフラグを指定すると[0-90-9]と等しくなるようです。また同様にして[ぁ-ん],[ァ-ン]で平仮名カタカナを表現できます。さらに漢字は[一-龥]で指定できます(unicode1.0で規定されている文字のみ)。ちなみに正確な漢字を表す正規表現については、この辺を見るのが良さそうです。

また正規表現とは離れますが、unicode文字にも幾つか有用なメソッドがある事を知りました。詳細はリファレンスを参照下さいですが、isalphaで英字+日本語, isalnumで英数字+日本語を判定する事が出来ます。今まで似た様な処理をするのに全角半角を変換したり、カタカナをひらがなに変換したりと前処理をする事が多かったのですが、unicodeを使うと日本語の処理が簡潔に書けそうですね。

1 thought on “pythonの正規表現で日本語を扱う”

Leave a Reply

Your email address will not be published. Required fields are marked *