🧶

つぶやき正規表現【Python】

2021/08/05に公開

漢字・ひらがな・カタカナだけ

先日、Pythonのプログラムで「正規表現を使って漢字・ひらがな・カタカナだけを許可する」処理を書くにあたって、調べたことをアウトプットしてみます。

文字列全体が正規表現にマッチするか判定する

ある文字列の全体が、あらかじめ定義した正規表現にマッチするか調べるにはre.fullmatch()が使えるそう。

import re

num = r'^[1-9][0-9]{0,4}$'
re_num = re.compile(num)
print(re_num.fullmatch('123'))
# → <re.Match object; span=(0, 3), match='123'>

ちなみに、上のコード例でnumについているrraw文字列と呼ばれるもので、通常エスケープ文字となる\を単なる文字列として扱います。

公式ドキュメントでは、raw文字列を使った正規表現の定義が推奨されているようでした。

文字コードを利用したパターン作成

で、本題の「漢字・ひらがな・カタカナを許可する正規表現」ですが、結論から言うと「文字コードにおけるその範囲を指定する」という方法で実装できるようです。

import re

name = r'^[\u4E00-\u9FFF|\u3040-\u309F|\u30A0-\u30FF]{1,10} [\u4E00-\u9FFF|\u3040-\u309F|\u30A0-\u30FF]{1,10}$'
re_name = re.compile(name)
print(re_name.fullmatch('田中 ピコ太郎'))
# → <re.Match object; span=(0, 7), match='田中\u3000ピコ太郎'>

ぱっと見ではわかりにくいですが、unicodeにおいて漢字が定義されている範囲(\u4E00-\u9FFF)、ひらがなの範囲(\u3040-\u309F)、カタカナの範囲(\u30A0-\u30FF)を区切って記載しています。

ちなみにこのCJK統合漢字と呼ばれるunicodeの漢字のブロックでは、中国の簡体字・台湾の繁体字もまとめたうえで、部首順に並べています。この性質によって、Javaなどでunicodeの順に文字列をソートすると、漢字圏の人間から見て秩序を見出しにくい結果が得られることもあります。

参考

Discussion