閉じる

Pythonで日本語(ひらがな・漢字)を正規表現で扱う方法:ユニコードプロパティ活用術

Pythonで日本語の文字列を処理する際、正規表現はテキストデータの抽出やバリデーションにおいて非常に強力なツールとなります。

しかし、従来の文字範囲を指定する手法だけでは、複雑な漢字や記号を含む日本語を正確に判別するのは困難でした。

2026年現在のモダンなPython開発においては、ユニコードプロパティを活用した正規表現が最も効率的で確実な選択肢となっています。

本記事では、ひらがな・カタカナ・漢字をスマートに扱うためのユニコードプロパティ活用術について詳しく解説します。

日本語正規表現の課題とユニコードプロパティのメリット

従来のPython標準ライブラリであるreモジュールでは、日本語を判定するために[ぁ-ん]のような文字コードの範囲指定を多用してきました。

この方法には、特定の記号や拡張文字が含まれないといった柔軟性の欠如や、コードの可読性が低下するという大きな課題がありました。

一方で、ユニコードプロパティ(Unicode Properties)を使用すれば、文字の種類を「意味のある名前」で指定することが可能になります。

例えば、「ひらがな」というグループ全体を一括で指定できるため、メンテナンス性が飛躍的に向上します。

Pythonにおいてこの高度な機能を利用するためには、標準のreモジュールよりも多機能なregexライブラリの活用が不可欠です。

regexライブラリの導入と基本設定

ユニコードプロパティによる正規表現をサポートしているのは、サードパーティ製のregexモジュールです。

このライブラリは、標準のreモジュールと互換性を持ちつつ、ユニコードの最新仕様に準拠しています。

regexのインストール方法

まずは、パッケージ管理ツールのpipを使用してライブラリをインストールしましょう。

Shell
pip install regex

インストールが完了したら、プログラム内でimport regexとして呼び出します。

各文字種(ひらがな・カタカナ・漢字)の指定方法

regexモジュールを使用することで、\p{Property}という形式で文字種を直接指定できるようになります。

代表的な日本語の文字種に対応するプロパティを以下の表にまとめました。

文字種ユニコードプロパティ説明
ひらがな\p{Hiragana}ひらがな全般を指定
カタカナ\p{Katakana}全角カタカナを指定
漢字\p{Han}常用漢字を含むすべての漢字を指定
日本語全体[\p{Hiragana}\p{Katakana}\p{Han}]ひらがな・カタカナ・漢字のいずれか

ひらがなを判定する正規表現

特定の文字列が「すべてひらがな」であるかを確認するコード例を見てみましょう。

Python
import regex

# 判定するテキスト
text = "ぷろぐらみんぐ"

# ひらがなのみにマッチする正規表現
pattern = r'^\p{Hiragana}+$'

if regex.match(pattern, text):
    print("すべてひらがなです。")
else:
    print("ひらがな以外の文字が含まれています。")
実行結果
すべてひらがなです。

カタカナを判定する正規表現

カタカナの判定も同様に簡単です。

長音記号(ー)を含むかどうかは用途によって注意が必要ですが、\p{Katakana}は基本の文字を網羅しています。

Python
import regex

text = "Pythonパイソン"

# カタカナのみを抽出
katakana_list = regex.findall(r'\p{Katakana}+', text)
print(katakana_list)
実行結果
['パイソン']

漢字を判定する正規表現(Scriptプロパティ)

漢字の判定には\p{Han}を使用します。

これは従来の[一-龠]という範囲指定よりも格段に正確であり、最新のユニコードで追加された漢字もカバーされます。

Python
import regex

text = "Pythonプログラミング言語"

# 漢字のみを抽出
kanji_list = regex.findall(r'\p{Han}+', text)
print(kanji_list)
実行結果
['言語']

実践的なコード例:日本語の抽出と置換

より実用的なシーンとして、混在したテキストから日本語部分だけを取り出す方法を解説します。

「ひらがな、カタカナ、漢字」のいずれかに該当する文字をターゲットにします。

Python
import regex

# 記号や英字が混ざった文字列
mixed_text = "2026年のPython学習は、とってもEnjoy!"

# 日本語(ひらがな・カタカナ・漢字)のみを抽出するパターン
# [ ] 内に複数のプロパティを並べることで「いずれか」を指定できる
jp_pattern = r'[\p{Hiragana}\p{Katakana}\p{Han}]+'

matches = regex.findall(jp_pattern, mixed_text)
print(f"抽出結果: {matches}")

# 日本語以外の文字を削除(置換)して結合
clean_text = "".join(matches)
print(f"結合結果: {clean_text}")
実行結果
抽出結果: ['年の', '学習は', 'とっても']
結合結果: 年の学習はとっても

このように、ユニコードプロパティを利用することで、複雑な条件分岐を書くことなく直感的なコードで日本語処理が可能になります。

高度な活用:Script_Extensionsによる精度向上

さらに高度な制御が必要な場合は、Script_Extensionsプロパティを使用することを検討してください。

例えば、日本語の文章中に出現する「々(繰り返し記号)」や「ー(長音記号)」は、厳密には特定の文字種に属さない場合があります。

regexライブラリでは、これらの記号を日本語の一部としてより自然に扱うオプションも提供されています。

基本的には\p{Hiragana}\p{Han}で十分ですが、業務システムなどの厳密なバリデーションではこれらのプロパティの違いが重要になります。

まとめ

Pythonで日本語の正規表現を扱う際は、標準のreモジュールを超えて、regexライブラリとユニコードプロパティを活用することが2026年のデファクトスタンダードです。

\p{Hiragana}\p{Katakana}\p{Han}といったプロパティを活用することで、文字コードの範囲を意識することなく、安全かつ簡潔に日本語を処理できます。

従来の複雑な正規表現パターンに悩まされている方は、ぜひこの機会にユニコードプロパティベースの記述方法に移行してみてください。

コードの可読性が高まるだけでなく、将来的なユニコードのアップデートにも強い堅牢なプログラムを作成することができるでしょう。

URLをコピーしました!