Python3でCamelCase変換: 後で思い出せない予感がしたので、メモしてみた。

By | 2019年1月16日

はじめに

CSVファイルやExcelのファイルに書かれているデータからSQL文などを作ったり、別のデータフォーマットに変換する等するための簡単なプログラムを書くときに、以前はPerlを使って書いていました。

UnixやLinuxだけで自分専用のプログラムを書いている分にはPerlの方が今でも楽で良いのですが、自分で書いたプログラムを他の人に使ってもらうときにPerlではちょいと手間がかかることと、今後のプログラミング言語の需要についての動向の予測なども考慮した結果、ワンライナーなどのごく一部の例外を除き、一昨年(2017年)頃からPython3を使うことにしました。

そうは言っても、長年の使用ですっかりPerl脳になってしまったものを変えるというのはなかなか容易なことではありません。特に、「Perlが得意としていて、Python3では実装が簡単ではない処理」を実装せねばならなくなった時などには、プログラムの冒頭にうっかり

#!/usr/bin/perl

と書いてからあわてて、

#!/usr/bin/env python3

と書き直すことは…

めったにありませんが、たまにあります。(´・ω・`)

そんな中、Python3でCamelCase変換を行う処理を書かねばならなくなったところ、いろいろと調べることになったので、この記事ではその成果について書きます。

なお、この記事では記述したプログラムをPython 3.7.1を使って実行することにより、プログラムの動作を確認しています。

スポンサーリンク

ところで、CamelCase変換ってなんですか?

説明しよう!!

CamelCaseとは複合語をひと綴りとして、要素語の最初を大文字で書き表すことで、CamelCase変換とはプログラム中の変数名などのスペース文字の使用が仕様上許されていない名前を複合語や文章などから変数名などを作り出すために使われる記法です。


スポンサーリンク

たとえば、

pandanote is a good point to start

という文章のようなものがあって、この文字列に対してCamelCase変換を施すと、

PandanoteIsAGoodPointToStart.

となります。ただし、プログラム中の変数名などに使用する場合には慣習上先頭の文字を小文字とすることが多いので、

pandanoteIsAGoodPointToStart

となるような変換を行うことがよく行われます(※個人の感想です)。


スポンサーリンク

この記事では変換の結果が一番最後に示したような結果となるCamelCase変換を主に考えます。

プログラムを書いてみます。

Perlのワンライナー

まずPython3との比較のため、PerlのワンライナーでCamelCase変換を実行するプログラムを書いてみます。

これは、&backslash;uを使って以下のように書けて、かつ実行できます。

[panda@pandanote.info ~]$ echo “pandanote is a good point to start” | perl -pe ‘s/ (.)/\u\1/g’
pandanoteIsAGoodPointToStart

 

また、以下のように書いて実行すると、先頭の文字(“pandanote”の”p”)も大文字にできます。なお、最初の括弧内に”?:”を挿入することで、文字列またはスペースの直後に現れる文字がグループ化されることを防いでいます。

[panda@pandanote.info ~]$ echo “pandanote is a good point to start” | perl -pe ‘s/(?:^| )(.)/\u\1/g’
PandanoteIsAGoodPointToStart

 

Python3の関数を使ってみる。

次に、前節と同じ処理をPython3で書いてみます。

Python3ではreパッケージのsub関数を使うと正規表現を使った文字列の変換を行うことができますが、Perlでは使えていた &backslash;u またはそれに相当する機能を持つ特殊変数がreパッケージのsub関数では使用できません。

幸いなことに、reパッケージのsub関数の第2引数には第1引数に指定されたパターンにマッチした文字列を保持するオブジェクトを引数とする関数の関数名を指定できますので、これとupperメソッドを組み合わせてCamelCase変換のコードを書いてみます。

…というわけで、以下のようなコードを書いてみました。

Perlのコードに比べてかなり冗長な感じもしますが、これでも以下のように標準入力から読み込んだ文字列に対してCamelCase変換を行うことができます。

[panda@pandanote.info ~]$ echo “pandanote is a good point to start” | python3 camelcasetest1.py
pandanoteIsAGoodPointToStart

 

なお、sub関数の第1引数の部分を以下のようにちょいと書き換えると先頭の文字も大文字に変換できます。

実行してみます。

[panda@pandanote.info ~]$ echo “pandanote is a good point to start” | python3 camelcasetest2.py
PandanoteIsAGoodPointToStart

 
ここまでのプログラムにより、(かなり冗長ではありますが、)Perlによるプログラムと同様の実行結果を得ることができました。😃

Python3のラムダ式を使ってみる。

Perlではワンライナーでできるものが、Python3では10行以上になる上にdefを使って関数を定義せねば実現できないというのは正直いかがなものかと思っていたところ、sub関数の第2引数にはラムダ式が使えるとのことなので、ラムダ式を使って書き換えてみたのが、以下のコードです。

defを使った関数の定義がなくなった分だけプログラムが短くなりました。(`・ω・´)

気のせいか、ちょっとだけカッコいいプログラムになったような気もします(※個人の感想です)。

スポンサーリンク

まとめ

Perlのワンライナーと比べると長くなってはしまいますが、Python3でCamelCase変換を行うプログラムを書いてみました。

ラムダ式とか書けるようになると、また一つ賢くなったような気分になる反面、(Scala関連の記事でも書いたような気がしますが、)ロジックの凝集度が高まるので、プログラムを書くときも後で読み解く時にも頭と神経を以前よりも使うようになりました。

したがって、後で自分が思い出す時も頭を使うことになりそうなので、記事としてまとめておけば後で似たようなプログラムが必要になった時に必要となるであろう作業負荷を軽減させることができそうです。😊

この記事は以上です。

References / 参考文献