Pythonで文字列長さ算出!全角半角判定をする方法

  • このエントリーをはてなブックマークに追加

Pythonで文字列の長さを計算するlen()は文字列の個数を算出してくれる便利な関数ですが、全角と半角の判別をしてはくれません。ここでは、文字列の全角と半角を考慮した長さを算出する方法について学びます。

こんにちは。wat(@watlablog)です。
ここではlen()では出来ない全角と半角の判別を含む文字列長計算方法を紹介します

文字列の全角と半角を判別することで応用できる2つのこと

①全角半角判別は画像処理で正確な長さが欲しい時に使う⇒追記:もっと良い方法がありました

Python標準関数であるlen()を使えば文字数は簡単に計算することができるのに、なぜ全角と半角を区別した計算方法が必要なのかということを疑問に思う人も多くいるでしょう。

通常文字数の長さを調べる必要性とは、「Pythonテキスト処理!文章中からHTMLタグを取り除いてみた」でテキストをスクレイピングする時のように、正確に抽出数を算出したい時にあります。

他にもforループやwhileループで文字数分のループを回したい時にも、len()は重宝することでしょう。

全角と半角を判別する意味とは?

全角と半角を判別するコードは画像処理の分野で効果を発揮します

というのも、僕がこの記事を書いているのは、「Pythonで画像に日本語文字を入れる方法」で画像に文字を入れたことがきっかけです。

最終的にはこのコードを、動画へのテロップ挿入時の文字位置を自動調整する技術に使いたいと思っています。

この時、len()でピクセル推定をしてしまうと、全角は半角2個分のスペースを使ったりといった計算をしようとした所で誤差を生みます。

このような誤差を生じさせないように、全角と半角を判別し、適切な文字列長を計算することを目指します。

この記事を書いた時までは、全角と半角の区別を付け、それに合わせてサイズを推定することを目指していましたが、フォントはそんなに簡単では無く、半角でも文字によって画像にした時のピクセルサイズが様々であることがわかりました。
そのため、
Pythonで画像に描画するテキストのピクセルサイズを取得にわかったことと解決方法をまとめましたので、画像処理でテキストを扱う方は是非こちらの記事を参照下さい!

但し、この記事は②の方法で有用であるためこのまま残しておきたいと思います。

②規定フォーマットに合わせたカラム調整が出来る

僕自身の主目的はあくまで画像処理のためですが、他にも応用可能な場面は多々あります。

例えば、CAE屋さんはよく解析の入力ファイルを自動生成するコードを書いたりしますが、大抵のテキストベースの入力ファイルは横幅が決まっているものです。

入力ファイルのコメント欄等に日本語のメッセージを書いていたらうっかりフォーマットを崩してしまった、ということにもなりかねません。

他にも文書系のファイルで体裁を保って自動化をしたい時は意外と文字列の長さというのを気にする場面もあるでしょう。

そういった規定のフォーマットに合わせるような自動化をする際にも全角半角判別は有用です。

全角と半角を判別して文字列長を計算するコード

全コード

それでは、まずは文章の文字の全角と半角を判別して文字列長を計算するプログラムの全コードを紹介します。

インポートするパッケージはPython標準パッケージとしてPython本体と一緒にインストールされるunicodedataを使います。

全体の構成としては、文章messageを引数として関数に渡し、文字列長を得るという流れです。

文字列長は関数count_textで計算します。この関数は文字種類を判別してくれるunicodedata.east_asian_width()で1文字ずつ文字列長を調査し、半角なら1、全角なら2を積算していくものです。

実行結果:.east_asian_width()は文字列種類を判別する

上のコードを実行すると、以下の結果をコンソールに表示させます。

文章「ア11α漢」を1文字ずつ判別すると、それぞれHNaFAWとなります。予めそれらが半角(1)か全角(2)かを定義してあり、今回の文字列は半角2個全角3個なので、文字列長は8となります。

これをlen()で調査すると5になります。

まとめ

本ページでは文字列の種類を割り出し、全角か半角かを判別する関数を使って正確な文字列長を計算しました。

全角を2、半角を1として文字列長を計算することで、様々な文書作成自動化に貢献できると思います。

今回は地味なコードですが、結構役に立つ内容です!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*