文字列の処理
ここでは、Pythonのプログラムで文字データを処理する(読む、書く、編集する)方法を説明します。
まず、「文字」というのは「character」の訳です。characterとは、「A」「B」、「あ」、「い」のように、一文字で表されるデータです。そして、複数の文字(の並び)で表されるデータのことを文字列といいます。これは「string」の訳です。「Boston」は文字が6つ並んだ文字列、「Massachusetts」は文字が13個並んだ文字列です。プログラミングの用語としては、letterとは言わずcharacterといい、charactersとは言わずstringということが多いです(理由は不明)。
このように、厳密にいえば文字と文字列(characterとstring)は違うものですが、文字列の特別な場合が文字だと考えることができるので、文字のことは忘れてしまっても構いません。例えば、「Boston」は文字数6の文字列ですが、最初の5文字(Bosto)を消去すると「n」が残ります。これは文字数1の文字列とも言えるし、文字だということもできます。したがって、Pythonのプログラミングでは、文字列だけを使えばよいことになっており、文字のことは無視できます。ちなみに、文字列の中に含まれている文字数のことを、文字列の「長さ」とか「サイズ」といいます。「Boston」は、長さ(サイズ)が6の文字列です。
文字列を作る
文字列を作って使う時には、その文字列をダブル・クォーテーション「”」で囲みます。シングル・クォーテーション「’」で囲ってもいいのですが(もしかしたらPython的にはそちらの方が普通かもしれませんが)、私は個人的好み(習慣)でダブル・クォーテーションを使っています。以下の例は、「Boston」という文字列を作り、cityという名前の変数(variable)に入れています。
city = "Boston"
このように文字列をダブル・クォーテーションで囲むことで、Python(のプログラム実行環境)に、「Bostonというのは文字列ですよ」と教えています。もしダブル・クォーテーションを付けないと(付け忘れると)、Pythonは「Bostonという名前の変数がそこにある」と解釈してしまいます。上の例で「city」にはダブル・クォーテーションがついていません。したがって、Pythonはcityは変数、Bostonは文字列なのだと理解します。
文字列の長さを調べる
文字列の長さを調べたい時には、文字列を関数len()に渡します。
city = "Boston"
stringLength = len(city)
ここで、”Boston”の長さは6なので、len(city)の部分は6を返し、その6が変数stringLengthに入ります。
文字列をシェルに表示(出力)する
文字列をシェルに(ThonnyのShellに)表示するには、以下のように関数print()を使います。
print(city)
関数print()に渡せるのは文字列だけです。文字列以外のものを渡すとエラーになります。つまり、Python(のプログラム実行環境)がプログラムの実行を強制終了し、「文字列でないものをprint()に渡している」というエラーメッセージを表示します。例えば、
print(12345)
とすると、Pythonは「12345」が整数で、整数がprint()に渡されていると理解するので、エラーとなります。もし12345をシェルに表示したいなら、この整数を文字列に変換してprint()に渡す必要があります。
print( str(12345) )
このように、関数str()は文字列でないデータを文字列に変換してくれます。この関数名「str」は、string(文字列)の略です。
複数の文字列をつなげる(連結する)
複数の文字列があって、それらをつなげて(連結して)ひとつの文字列にしたいことがあります。この作業を「string concatenation」といいます。これをするには、以下のように、文字列を連結する専用の記号(命令)として「+」を使います。
city = "Boston"
state = "Massachusetts"
print( city + state )
「Boston」と「Massachusetts」が連結されるので「BostonMassachusetts」となり、それがシェルに表示されます。この文字列連結用の記号「+」は足し算の記号と同じものです。+の前後に文字列が来れば文字列の連結になり、+の前後に数字が来れば数字の足し算になります。なお、「BostonMassachusetts」では見栄えが悪いので、BostonとMassachusettsの間にスペースを入れたいと思うかもしれません。その場合には以下のようにします。
print( city + " " + state )
ここでは、3つの文字列を連結しています。2つめの文字列はスペースがひとつです。表示結果は「Boston Massachusetts」となります。あるいは以下のようにすることもできます。
print( city + ", " + state )
表示結果は「Boston, Massachusetts」となります。連結する文字列の数に制限はありません。以下の例では5つの文字列を連結しています。
city = "Boston"
state = "Massachusetts"
zipCode = "02125"
print( city + ", " + state + " " + zipCode )
表示結果は「Boston, Massachusetts 02125」となります。
オンライン・サービスなどのアカウントを作る際にパスワードを設定しますが、その時に「○文字以上の長さのパスワードにしてください」と言われることがあります。その最低文字数未満のパスワードを設定しようとするとエラーになって、違うパスワードにしろと言われます。こういう機能は、先に説明した関数len()や関数str()、文字列の連結を使えば実現できます。
password = "abc"
minimumPasswordLength = 8
if len(password) < 8:
print("Your password is too short. It should have at least " + str(minimumPasswordLength) + " characters.")
この例では、文字数が8文字以上なければならないことにしています。設定しようとしているパスワードは”abc”で、この文字列が変数passwordに入っています。len(password)という風に関数len()を使って、パスワードの長さを調べています。もしそれが8未満ならエラーメッセージを出します。
小文字と大文字を変換する
小文字と大文字の変換をしたい場合には、次のようにします。まずは、小文字を大文字に変換する方法から。
city = "boston"
print( city.upper() )
このように、「文字列.upper()」という書き方をします。upper()は、文字列の中の文字をすべて大文字にします。この例では「BOSTON」という結果になります。もし、お好みであれば、同じことを以下のように書くこともできます。
print( "boston".upper() )
次に大文字を小文字に変換する方法です。表示結果は「boston」となります。
city = "BOSTON"
print( city.lower())
次は、文字列の中の先頭の文字だけを大文字にする方法です。
city = "boston"
print( city.capitalize())
「boston」が「Boston」に変換されます。
文字を別の文字に置き換える
文字列の中のある文字を別の文字に変えたいときがあります。それには、以下のように「文字列.replace()」というプログラムの書き方をします。
city = "Boston"
print( city.replace("s", "l") )
replace()を使う時には、2つのデータを渡します。1つ目が「どの文字を変換したいか」で、2つ目が「どの文字に置き換えたいか」です。上の例では、「s」が「l」に置き換わり、表示結果は「Bolton」になります。
文字列の中の文字を順番に読む
文字列に含まれている文字をひとつひとつ読んでチェックしたいことがあります。その場合には、以下のように「ループ」を使います。ループというのは同じ作業を何度もくり返すときに使います。このループは「for」という特別な記号(命令)を使ったものなので「forループ」と呼ばれています。
city = "Boston"
for character in city:
print(character)
forループの先頭行では、「for」の後に変数を定義する決まりになっています(変数の名前は何でもよい)。ここでは「character」という名前の変数になっています。この例では、「文字列cityの中の各文字をcharacterで表す」と理解します。そしてループの実行過程は次のようになります。
- ループを最初に実行するときには、cityの中に入っている最初の文字「B」を変数characterに格納し、ループ内のプログラム(つまり関数print()を呼ぶ1行分)を実行する。つまり以下のプログラムが実行される。
print("B")
- ループを2回目に実行するときには、cityの中に入っている2番目の文字「o」を変数characterに格納し、ループ内のプログラムを実行する。つまり以下のプログラムが実行される。
print("o")
同様に、ループの3回目、4回目の実行時には、cityに入っている3番目、4番目の文字(「s」と「t」)が使われます。cityに入っている文字数は6個なので、このループは6回実行されます。
オンライン・サービスなどのアカウントを作る際にパスワードを設定しますが、その時に「アルファベット以外の文字を最低○個使ってくれ」と言われることがあります。それを守らないとエラーになって、違うパスワードにしろと言われます。こういう機能は、パスワードの文字列をひとつひとつ順番にチェックすれば実現できます。
password = "abc012!@#"
nonAlphabetCount = 0
for character in password:
if character.isalpha() == False:
nonAlphabetCount = nonAlphabetCount + 1
print( str(nonAlphabetCount) )
ここでは、設定しようとしているパスワードが”abc012!@#”で、この文字列が変数passwordに入っています。もうひとつの変数nonAlphabetCountは、パスワードの中の「アルファベット以外の文字」を数えるのに使います。最初は0が入っています。forループでは、passwordの中に入っている文字をひとつづつ読んで、その文字がアルファベットかどうかを調べています。以下のように、「文字列.isalpha()」とすると、文字列がアルファベットなのかどうかを調べることができます。
character.isalpha()
ここで、characterの中の文字がアルファベットならYesが返り、アルファベットでなければNoが返ります。プログラミング用語では、Yesのことを「True」といい、Noのことは「False」といいます。上記プログラムでは、characterの中の文字がアルファベットでなければ、nonAlphabetCountの数字に1を足して、足し算の結果を再度nonAlphabetCountに入れています。つまり、現在のnonAlphabetCountの数が1増えます。このようにして、passwordの中のすべての文字を調べ終わると(ループの実行が終わると)、nonAlphabetCountはpasswordの中にアルファベットでない文字が何個あったかを表します。
文字列.isalpha()と似たような機能として、以下のようなものもあります。
- 文字列.isdecimal()は、文字列が数字かどうかを調べる。
- 文字列.isupper()は、文字列が大文字かどうかを調べる
- 文字列.islower()は、文字列が小文字かどうかを調べる