17: Pythonの文字列操作の基礎をマスターする

前回の続きです。

文字列はプログラミングの基礎中の基礎

続いて文字列型で文字列を操作するというものを見ていきましょう。まず文字列型とは、コンピュータで表示される文字の塊です。文字列はとてもよく使います。

文字列にはいろいろなメソッド、つまり文字列を操作するための動作があり非常に奥が深いです。

動作には例えばどんなものがあるかというと、0文字以上の操作ができます。文字列の中で任意の文字の位置を検索してみたり、ある文字をある文字に置き換えたり、文字列を結合したりと様々にあります。

文字列型、つまりstr型は(stringの頭文字を使用してstr型という)文字列という意味です。str型にするにはシングルクォーテーション、もしくはダブルクォーテーションで囲みます。

文字列にするには、シングルクォーテーション、ダブルクォーテーションどちらでも大丈夫です。

どういうときにそれぞれ使い分けするかというと、文字列の中でシングルクォーテーション及びダブルクォーテーションを使いたい場合は、もう一方の記号で囲います。

以下のように文字列の中で、シングルクォーテーションやダブルクォーテーションを使用したい場合、もう一方のクォーテーションでかこいます。

'I am "IKUMA"'

あるいは以下のようにダブルクォーテーションの中にシングルクォーテーションを書くことができます。

"I'm IKUMA"

しかし、以下のようにシングルクォーテーションですべて書こうとしてもエラーになってしまいます。

'I'm IKUMA'

このように文字列の中でシングルクォーテーションを使いたい場合は、ダブルクォーテーションで囲む必要があります。

文字列の中でダブルクォーテーションを使いたい場合はシングルクォーテーションで文字列を使います。

ここまでのまとめです。文字列というのはコンピュータに表示される文字の塊。これが文字列です。

そして、どのように文字列str型にするかというと、シングルクォーテーションもしくはダブルクォーテーションで囲みます。これはどちらでも構いません。

そしてこの使い分けとしてある文字列の中でシングルクォーテーション及びダブルクォーテーションを使いたい場合、もう一方の記号で囲います。

こうすれば、それぞれの記号を使うことができます。

以上、文字列とは何か、そしてどのように文字列にするかでした。

初心者つまずきポイントである「数字」と「数値」の違いを理解する

次は初心者が陥りがちな罠、Pythonでは数字と数値は区別される、という話をしたいと思います。

どういうことかというと、数字と数値は違い、数字でもシングルクォーテーションおよびダブルクォーテーションで囲われた数字と、囲われていない数値は違う型としてコンピュータに認識されます。

数字と数値はお互い違うものなので、演算しようとするとエラーになると言う話です。その話をここでもう一度したいと思います。

'1' # str型 = 数字
1   # int型 = 数値

人間は文脈によってこの「数字」と「数値」を無意識に使い分けられます。しかしコンピュータはそうではありません。

例えば、数字の例としてアンケートで好きな料理を次の中から選んでくださいとあるとします。

1.日本料理、2.中華料理、3.インド料理、のような選択肢に振ってある番号、これが「数字」です。

これ1、2、3と書いてありますが、これ普通は計算しないと思います。

そして、この数字と数値、例えば私がよく使うプログラミング言語にExcelVBAがありますが、ExcelVBAでは文字列の’1’と数値の1を同じものとして扱ってくれるという仕様があります。

平たく言うと数値っぽいものは数値として扱う、という仕様になっています。

しかしPythonはそのような仕様にはなっておらず、あくまで文字列は文字列ですから数値と数字は計算できません。エラーになります。

今回はPythonコンソールを使ってください。

例えば

100 + 100

これは特に問題なく実行できます。

一方、

'100' + "100"

これは、文字列同士の結合になり、結果は100100になります。

プラス演算子を使った場合、文字同士を結合すると言う意味になります。

そして、

100 + "100"

これはエラーになります。

こんなふうにint型の100と文字列の100を計算することがあるか? という話ですが、わりとあります。

どういう時かというと、input関数といって、ユーザーに何か値を入力してもらう関数がありますが、そこで入力した値はstr型になります。

なので、違う型同士を演算するということがあり得ます。

実行結果がすぐに表示されるPythonコンソールで試してみましょう。画像と同じようにコードを入力してください。

このように年齢をユーザーに尋ねる事ができます。答えとして例えば20歳ですとやります。

そうすると今、ageという変数には20というものが入っているということになります。しかしこの時、ageという変数の中身は、’20’ という答えが返ってきています。よく見るとシングルクォーテーションが付いています。つまりstr型です。type関数で確認してもstr型となっています。

例えばこのageに1を加えたいという演算をしようとするとエラーになります。

このような場合、どうすればいいのか?ここで型変換というものを使います。(型変換のことをキャストとも言います)

例えばint関数というものがありますが、int(age) とやりますと、age はもとはstr型でしたが、int型になります。シングルクォーテーションが取れて、「数字」ではなくて「数値」の20になります。

このように型変換を行なうと計算できるようになり、結果は21になります。

int(age) + 1

以前、Pythonは動的型付け言語とお話しましたが、動的に型が決まりますので、このようにstr型からint型の変数の型に書き換えることができると言うことになります。

input関数で得た値をキャストするということはよくありますので、テクニックの一つとして覚えておきましょう。

ここではint型の例でしたがfloat型でも同様です。

ということで、Pythonでは数字と数値は区別されます、という話でした。初心者のつまずきポイントですから、このことはよく覚えておいてください。

プログラミングで頻出する「文字列の結合」を習得する

続いて文字列同士の結合を見ていきましょう。今回もPythonコンソールを使います。

文字列同士を結合する機会は頻繁にありますので、どのように行うかしっかり押さえておきましょう。

結合する方法はいろいろありますが、代表的なものとしてプラス演算子を使うもの、そしてアスタリスクを使うもの、そしてF文字列を使うものなどがあります。

ほかにもありますが、今回はこの3つに絞ってお話しいたします。

プラス演算子で文字列同士を結合

プラス演算子で文字列同士を結合することができます。

以下のコードはどちらもPythonという文字列になります。

py = 'Py' + 'thon'
a = 'Py'
b = 'thon'
a + b

このように文字列を結合できるんですが、実はあまり使いません。後で紹介するf文字列という方が圧倒的に使い勝手がいいためです。

アスタリスクで結合

続いてアスタリスクですが、これは指定した文字を複数回繰り返して結合します。

c = Hello
c * 10

このようにするとHello が10回繰り返されます。私は ”-” * 50 というふうに区切り記号を表示する時に使います。

f文字列

次はf文字列です。format-stirngとかf-stringと言うこともあります。あるいはフォーマット済み文字列なんていうふうに言うこともあります。

どういうものかというと、文字列の中で変数を展開させるというものです。

以下のコードは変数を + 記号で結合して挨拶を表示するものです。ここからはPythonインタープリタではなくモジュール(Pythonファイル)に記述して実行してください。

first_name = "Hiroyuki"
last_name = "Ikuma"
print("Hello my name is " + first_name + " " + last_name + ".")

first_nameをプラス記号で結合、そしてさらにプラス記号とスペースを結合、さらにプラス記号でlast_nameという変数と結合し、最後にドットを結合する。これは非常に面倒です。

この面倒な書き方をしなくてもよいのがf文字列です。これを実行するとさきほどと同じ結果になります。

print(f"Hello my name is {first_name} {last_name}.")

このようにHello my name isと普通に書いて、その後波括弧で囲ってその中に展開したい変数を書きます。そして波括弧で閉じた後は普通に文字列を書くことができます。そしてさらに展開したいものがあれば続けて波括弧で囲って中に変数を書きます。

初心者のうちは、最初のfを書き忘れることがあります。特にエラーが出るとかそういうわけではないんですが波括弧で囲われた文字列になります。

このf文字列は非常によく使いますので覚えておきましょう。

ということで、今回のまとめです。

文字列を結合するには、このようにプラス演算子を使った方法、そして複数回繰り返すことができるアスタリスクを使った方法、そしてf文字列を使った方法があります。

プラス演算子を使った方法はあまり使いません。アスタリスクはたまに使うことがあります。

よく使うのがf文字列。これは文字列の中で変数展開できるものです。シングルクォーテーション及びダブルクォーテーションの前にfを付けます。そして波括弧を文字列の中に書いて、変数をその波括弧の中に書きます。非常によく使う書き方ですから覚えておきましょう。

文字列を操作するための文法を理解する

続いて文字列の操作を見ていきます。

文字列を操作するには次のようにいろいろな方法があります。

これらのうち、よく使うものに絞ってご紹介したいと思います。

前にも少しご紹介したinput関数というものがあります。これはユーザーからの入力を受け付ける関数です。

どのように使うかというと、

first_name = input("名前は?:")
last_name = input("苗字は?:")

このプログラムを実行すると、まず名前は?と表示されますので、名前を入力します。

次に苗字は? と聞かれますので、苗字を入力します。

このインプットの括弧の中に書いた文字が、ターミナルに表示されます。

このターミナルに名前や苗字をユーザーが入力するわけです。

このプログラムをもう一回実行し、たとえば太郎山田みたいな別の名前でも表示できます。

input関数は頻繁に使用します。本シリーズでもよく登場しますので、このinput関数は覚えておいてください。

続いてlen関数。本シリーズで使う場面がありますので、紹介しておきます。

print(f"名前は {len(first_name)} 文字です。")

len関数は、()で囲った文字列の文字数を返す関数です。

何文字か調べたい文字列をカッコの中にいれると、何文字ですという値が返ってきます。

たとえばHiroyukiという名前は8文字ですから、8という値が返ってきます。

続いてupper関数とlower関数をみていきます。

upper関数は()の中身を大文字にするというものです。lower関数は()の中身を小文字にするというものです。

first_name = "Hiroyuki"
print(first_name.upper())
print(first_name.lower())

first_name関数が”Hiroyuki”ですから、upper関数の方は、HIROYUKIに、lower関数の方はhiroyukiにそれぞれ変換されます。

それからint関数とかfloat関数でキャスト(型変換)というものもありました。

こちらは前のレクチャーでやりましたね。なので今回は割愛いたします。

そしてin演算子で要素の有無を判定するというものもあります。これも割とよく使う演算子です。

p = 'python'
result = 'th' in p
print(result)  # True

このinを使って変数pにthという文字列が含まれているかどうかを判定できます。

結果は、Trueです。Trueというのは、Yesという意味です。つまり変数 p に ‘th’ が入っている、という意味です。

そのTrueに対して、もう一つ対になるのがFalseというものです。こちらは、そうではない、という意味になります。

で、以前Pythonでは大文字、小文字全てのが区別されますと言う話をしたんですが、こちらTHと大文字にしてやってみます。

p = 'python'
result = 'TH' in p
print(result)  # False

するとこのpythonと言う文字列に大文字のTH入っているかどうかというものが判定されます。

このプログラムを実行するとFalseになります。大文字のTHは入ってませんということですね。

初心者のうち、よくやりがちなのがinの左右を間違えることです。

p = 'python'
result = p in 'th'
print(result)  # False

これ、実際私もよくやりました。実行するとFalseになります。

このプログラムを日本語にするとthという文字列の中にpythonという文字列が入っているか? というのを聞いています。thの中にはpythonはありませんよね。ですから、結果はFalseとなります。

英語をよく理解している方でしたら普通のことなのかもしれませんが、私の場合、全然英語ができませんので、’th’ in pというプログラムの書き方がわからなくて逆に書いてしまうことがよくありました。

他にも文字列操作で使えるものはいろいろとありますが、代表的なものとしていくつかご紹介いたしました。

もし他に何があるか知りたいと言う場合は、文字列に続いてドットを入力すると、いろいろな候補が出てきます。非常にたくさんのメソッドがあります。

また昨今は、こんなことをしたいということをChatGPTに聞くことで、Pythonではどのように書けばそれが実現できるかという回答を得られます。そういう使い方も非常に有効です。

関数とメソッドの違い

最後に補足ですが、ここでは関数とメソッドという言葉が出ています。

両者の違いは、関数は独立して使えるもの、メソッドは文字列とか変数の後にドットに続けて書く言葉です。

関数には例えばprint関数があります。このprint関数は、print の前に何か文字がくっついているわけではなく、独立して使われていますね。

一方以下のように、変数の後のドットに続けて書く言葉である upper()、これはメソッドです。

print(p.upper())

実態はどちらもdef キーワードで定義される関数ですが、厳密に言うとクラスに属している関数がメソッドです。クラスに属していないものを関数というふうに呼びます。(def キーワードは後述します)

クラスというのは超ざっくり説明すると、型のことです。str型を、strクラスなんて言うこともあるのですが、strクラスに属しているupperのことをupperメソッドと言います。かなりややこしいですね。

本シリーズではドットの後に続けて書く言葉、という認識でひとまず大丈夫です。この関数とかメソッドという呼び分け、本シリーズでしていくかと思います。それぞれちょっと異なるニュアンスがありますので、そのことだけ頭の片隅に置いておいてください。

特殊文字を理解して文字列を改行できるようにする

それでは、str型、最後のトピックとして改行を含む文字列について見ていきましょう。

Hello.
My name is John.
Nice to meet you.

上記のように改行を含めてターミナルに文字列を表示したい場合があるとします。

そういう時は、

\n

という記号を使います。これは \(バックスラッシュ)と n をくっつけたものです。以下のようにすると本レクチャー冒頭のようにターミナルに改行して出力されます。

print('Hello.\nMy name is John.\nNice to meet you.')

これは、文字列の中 \n を入力すると、そこで改行するという意味になります。

Windowsの方はキーボードの右上にある ¥ キー入力でバックスラッシュになります。フォントによってバックスラッシュになるのが¥マークになるのか、少し違いますが、Windowsの場合は¥キーがバックスラッシュ入力のキーです。

Macの場合、Option キーと ¥ キーを押すことでバックスラッシュになります。Windowsとは違い、 ¥ と \ は区別されます。

このように、Pythonでは改行文字を \n で表現します。この \n はnew lineのnです。

少し余談です。このバックスラッシュは、プログラミングの世界では特殊文字、別名エスケープ文字と言います。 \n とか \t のように組み合わせて使うことがあります。 \t は改行ではなくタブ区切りになります。

また、このバックスラッシュ自体を表示したい場合は、

print('\\')

と、もうバックスラッシュの前にバックスラッシュをを書きます。バックスラッシュ自体を表示したい場合、バックスラッシュを2回書くということですね。

ということで、今回のまとめです。

文字列の中で改行させたい場合 \n を使います。この改行させる方法は本シリーズでもよく使いますので覚えておいてください。