Pythonの全角の変換や半角と区別しない判定方法

Pythonの全角の変換や判定

Pythonの全角・半角の変換 translateやunicodedata.normalize

Pythonの全角・半角の変換

Pythonのunicodedataモジュールのnormalize関数は、Unicode文字列の正規化処理を行うものです。Unicode文字列の正規化とは、UTF-8などのUnicodeエンコーディングを使用して表現された文字列を、標準的なUnicode表現に変換する処理です。

unicodedata.normalize関数は、引数として正規化するフォーマットを指定することができます。NFC(Normalization Form Canonical Composition)やNFD(Normalization Form Canonical Decomposition)などが指定可能です。また、引数として渡した文字列が正しいUnicode文字列であるかをチェックする機能も持っています。

全角→半角変換を行う場合は、引数に「NFKC」を指定します。

# テキストの全角・半角変換を行うサンプルコード
import unicodedata

# 対象の文字列
src_str = "ABCabc123123"

# 全角を半角に変換
dst_str = unicodedata.normalize('NFKC', src_str)

# 結果を出力
print(dst_str) # 出力:ABCabc123123

実行すると、全角・半角混じりの文字列は、「ABCabc123123」に変換されます。

Pythonのtranslate関数を使うことでも、全角・半角変換ができます。テキストから指定した文字を他の文字に変換する関数です。全角文字を半角文字に変換するには、以下のようにします。

table = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')

str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

# 全角文字を半角文字に変換
str = str.translate(table)

print(str)

実行するとこうなります。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

mojimojiモジュールを使っての全角・半角変換も可能です。

mojimojiとは、Pythonで日本語の文字列を扱うためのライブラリです。このライブラリを使うことで、日本語の文字列をスッキリした形式に整えたり、日本語の文字列を検索したり、日本語の文字列を句読点で分割したりすることができます。また、mojimojiでは日本語の文字列を簡単にUnicodeに変換することも可能です。

全角・半角変換を行うための関数「zen_to_han()」と「han_to_zen()」が用意されています。

zen_to_han()関数は、全角文字を半角文字に変換します。han_to_zen()関数は、半角文字を全角文字に変換します。

import mojimoji

before_text = 'ABCD123'
after_text = mojimoji.han_to_zen(mojimoji.zen_to_han(before_text))

print(after_text) # ABCD123

実行すると「ABCD123」となります。

Pythonの全角判定 unicodedata.east_aian_width

Pythonの全角判定

Pythonの全角判定は、unicodedataモジュールのeast_asian_widthで判定可能です。

unicodedata.east_asian_width(ch) in ‘FWA’は、指定した文字chが全角(F:Fullwidth)、半角(H:Halfwidth)、拡張(W:Wide)、または半拡張(A:Ambiguous)であるかどうかを示すものです。拡張文字とは、日本語などのアジア言語で使用される文字を指します。

import unicodedata

def is_full_width(text):
for ch in text:
if unicodedata.east_asian_width(ch) in 'FWA':
return True
return False

text = 'ABC'
print(is_full_width(text))

実行するとこうなります。「ABC」が全角であると判定されました。

True

Pythonの全角・半角を区別しない判定

Pythonの全角・半角を区別しない判定

Pythonで全角・半角を区別せずに同じかどうか判定するには、2つの文字列を半角に変換してから比較します。

import unicodedata

def ignore_case(str1, str2):
# 全角を半角に変換して比較
str1 = unicodedata.normalize('NFKC', str1)
str2 = unicodedata.normalize('NFKC', str2)
return str1.lower() == str2.lower()

# 実行例
str1 = "ABC"
str2 = "abc"

print(ignore_case(str1, str2)) # True

実行結果は、Trueとなります。

Pythonの全角のまとめ

Pythonの全角のまとめ

  • 全角文字は、半角文字と比較して2倍のサイズで表示される
  • 全角文字を使用するときは、文字種(英数字・記号・漢字など)に注意が必要
  • Pythonでは、文字列を全角・半角区別して扱うことが可能