Python正規表現で日本語・英数字を判別!漢字、ひらがな、カタカナ、全角/半角英数字の判定・抽出・カウント術

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks

Pythonでテキストデータを扱う際、文字列が日本語(漢字、ひらがな、カタカナ)なのか、それとも英数字なのかを判別したり、特定の種類の文字だけを抽出したり、その数をカウントしたりする必要がよくあります。正規表現を使えば、これらの複雑な文字種判別タスクを効率的に、かつ正確に処理することが可能です。この記事では、Pythonのreモジュールを使って、日本語文字と英数字を判別・抽出・カウントする方法を詳しく解説します。

日本語文字(漢字、ひらがな、カタカナ)の正規表現

日本語の文字種を正規表現で扱うには、Unicodeの特性を利用します。

ひらがな

ひらがなの範囲はUnicodeで\u3040-\u309Fです。

Python
 
import re

text = "こんにちは、今日は良い天気ですね。"
# ひらがなを抽出
hiragana_matches = re.findall(r"[\u3040-\u309F]", text)
print(f"ひらがな: {hiragana_matches}") # ['こ', 'ん', 'に', 'ち', 'は', '今', '日', 'は', '良', 'い', '天', '気', 'で', 'す', 'ね']
print(f"ひらがな数: {len(hiragana_matches)}") # 15

カタカナ

カタカナの範囲はUnicodeで\u30A0-\u30FFです。

Python
 
import re

text = "Pythonはプログラミング言語です。カタカナも使えます。"
# カタカナを抽出
katakana_matches = re.findall(r"[\u30A0-\u30FF]", text)
print(f"カタカナ: {katakana_matches}") # ['プ', 'ロ', 'グ', 'ラ', 'ミ', 'ン', 'グ', '言', '語', 'で', 'す', 'カ', 'タ', 'カ', 'ナ', 'も', '使', 'え', 'ま', 'す']
print(f"カタカナ数: {len(katakana_matches)}") # 20

漢字

漢字の範囲はUnicodeで\u4E00-\u9FFFが一般的です。ただし、漢字にはさらに広い範囲が存在するため、状況に応じて調整が必要です。

Python
 
import re

text = "漢字とひらがなとカタカナとEnglishと123。"
# 漢字を抽出
kanji_matches = re.findall(r"[\u4E00-\u9FFF]", text)
print(f"漢字: {kanji_matches}") # ['漢', '字']
print(f"漢字数: {len(kanji_matches)}") # 2

日本語全般(ひらがな、カタカナ、漢字)

これらの範囲を組み合わせて、日本語全般を対象にできます。

Python
 
import re

text = "あいうえお、アイウエオ、亜意卯江於、abcABC123"
# 日本語文字(ひらがな、カタカナ、漢字)を抽出
japanese_matches = re.findall(r"[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]", text)
print(f"日本語文字: {japanese_matches}") # ['あ', 'い', 'う', 'え', 'お', 'ア', 'イ', 'ウ', 'エ', 'オ', '亜', '意', '卯', '江', '於']
print(f"日本語文字数: {len(japanese_matches)}") # 15

英数字(全角・半角)の正規表現

半角英数字

半角英数字は[a-zA-Z0-9]で表現できます。

Python
 
import re

text = "Python is 1st language for many!"
# 半角英数字を抽出
half_width_alphanum = re.findall(r"[a-zA-Z0-9]", text)
print(f"半角英数字: {half_width_alphanum}") # ['P', 'y', 't', 'h', 'o', 'n', 'i', 's', '1', 's', 't', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', 'f', 'o', 'r', 'm', 'a', 'n', 'y']
print(f"半角英数字数: {len(half_width_alphanum)}") # 26

全角英数字

全角英数字はUnicodeで\uFF00-\uFFEFの範囲に含まれることが多く、特に全角英数字は\uFF01-\uFF5E(全角記号含む)や\uFF21-\uFF3A(全角大文字A-Z)、\uFF41-\uFF5A(全角小文字a-z)、\uFF10-\uFF19(全角数字0-9)などで指定できます。

Python
 
import re

text = "ABCDEFG12345あいうえお"
# 全角英数字を抽出(より正確に指定)
full_width_alphanum = re.findall(r"[\uFF21-\uFF3A\uFF41-\uFF5A\uFF10-\uFF19]", text)
print(f"全角英数字: {full_width_alphanum}") # ['A', 'B', 'C', 'D', 'E', 'F', 'G', '1', '2', '3', '4', '5']
print(f"全角英数字数: {len(full_width_alphanum)}") # 12

全角・半角英数字

両方含める場合は、それぞれの正規表現を組み合わせます。

Python
 
import re

text = "Mix of Abc, DEF, 123, 456 and 日本語"
# 全角・半角英数字を抽出
all_alphanum = re.findall(r"[a-zA-Z0-9\uFF21-\uFF3A\uFF41-\uFF5A\uFF10-\uFF19]", text)
print(f"全半角英数字: {all_alphanum}") # ['A', 'b', 'c', 'D', 'E', 'F', '1', '2', '3', '4', '5', '6']
print(f"全半角英数字数: {len(all_alphanum)}") # 12

判定・抽出・カウントの応用例

上記の正規表現パターンを応用することで、さまざまな文字列処理が可能です。

文字列に特定の文字種が含まれているか判定

re.search()を使って、文字列に特定の文字種が含まれているか判定できます。

Python
 
import re

text1 = "日本語が含まれるテキスト"
text2 = "English Only"

# 日本語が含まれるか判定
if re.search(r"[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]", text1):
    print(f"'{text1}'には日本語が含まれます。")
else:
    print(f"'{text1}'には日本語が含まれません。")

if re.search(r"[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]", text2):
    print(f"'{text2}'には日本語が含まれます。")
else:
    print(f"'{text2}'には日本語が含まれません。")

特定の文字種以外の文字を削除(クリーニング)

re.sub()を使って、特定の文字種以外の文字を削除し、文字列をクリーニングできます。

Python
 
import re

dirty_text = "日本語とEnglishと123!@#$%^"
# 日本語と半角英数字、半角数字のみ残す
cleaned_text = re.sub(r"[^a-zA-Z0-9\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]", "", dirty_text)
print(f"クリーニング後: {cleaned_text}") # 日本語とEnglishと123

まとめ

Pythonの正規表現とUnicode文字の範囲を組み合わせることで、**漢字、ひらがな、カタカナ、英数字(全角・半角)**の判別、抽出、カウントを柔軟に行うことができます。これらのテクニックは、自然言語処理(NLP)の前処理や、データのクレンジングなど、多様なテキスト処理タスクで非常に役立ちます。

「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks