連載
» 2019年04月19日 05時00分 公開

Python入門:[Python入門]文字列の操作 (1/4)

Pythonの文字列はさまざまに操作できる。文字数の取得、要素の取り出し、文字列に特定の文字列が含まれているかの判定、文字列の置換などを紹介する。

[かわさきしんじ,Deep Insider編集部]
「Python入門」のインデックス

連載目次

 前回は文字列の種類や書き方などを見たが、文字列に対してさまざまな操作を行うことも可能だ。例えば、文字数を数えたり、文字列から指定した位置(インデックス)にある文字を取り出したり、文字列内に特定の文字列が含まれているかを調べたりできる。以下では、これらの操作について簡単に見ていこう。

文字数を求める:len関数

 文字数を数えるにはlen関数を使う。

  • len(s)
    引数:s 文字列
    戻り値:文字数

 使い方は簡単でlen関数に対象の文字列を渡すだけだ。戻り値がその文字数となる。以下に例を示す。

str_len = len('Hello World')
print(str_len)
msg = 'Good-bye World'
str_len = len(msg)
print(str_len)

len関数の使用例

 実行結果は次の通り。

len関数の使用例 len関数の使用例

 なお、len関数は文字列だけではなく、リストやタプルなど、複数の要素を格納するオブジェクトの要素数を得るのにも使える(リストやタプルについては後続の回で取り上げる)。

文字列の要素を取得する:インデックス指定

 前回に述べたように、文字列とは文字が連なったものであり、文字列を構成する1つ1つの文字を「文字列の要素」と呼ぶ。そして、文字列を扱う際には、その要素を取り出したくなることもある。これには、文字列(や文字列を代入した変数)に角かっこ「[]」を続けて、その中に「取り出したい要素の文字列内での位置」を指定する。この「文字列内の位置」を「インデックス」と呼ぶ。

  • 文字列[index]
    index 取り出したい文字の位置を示すインデックス
    結果:指定した位置にある文字

 このとき、「インデックスは0始まり」であることに注意しよう。つまり、文字列の要素は「0文字目」「1文字目」……のように数えていく。

文字列とインデックス 文字列とインデックス

 例えば、変数msgに格納されている先頭の文字を取り出すには「msg[0]」のように指定する。以下に例を示す。

msg = 'Hello'
print(msg[0])

文字列msgの先頭の文字を表示

 実行結果を以下に示す。

文字列msgの先頭の文字を表示 文字列msgの先頭の文字を表示

 では、ここで練習問題。上の変数msgの最後の文字を取り出すにはどのようにすればよいだろう。「Hello」の文字数は5文字なので、まずは「5」と指定してみよう。

文字数をインデックスに指定した場合 文字数をインデックスに指定した場合

 エラーとなったことにビックリした人もいるかもしれない。だが、「インデックスは0始まり」であることを思い出そう。ということは、最後の要素のインデックスは「文字数−1」となる。よって、これは「msg[4]」とすることで取り出せる。

変数msgの最後の要素のインデックスは「4」 変数msgの最後の要素のインデックスは「4」

 だが、文字列の長さが変わるたびに、最後の要素を取り出すのに文字数を目で数えるのは面倒だ。文字数を数えるのにはlen関数が使えることは既に述べた。よって、インデックスに「len関数の戻り値−1」を指定すれば、文字列がどんなものであっても最後の要素を取り出せるということだ。ただし、以下に示すように「msg[len(msg)-1]」と少し面倒な書き方になる。

len関数で文字数を得て、それを使い、最後の要素を取り出す len関数で文字数を得て、それを使い、最後の要素を取り出す

 もっと簡単な方法もある。Pythonではインデックスに負の値を指定できるのだ。

負のインデックスは末尾から先頭に向かって値が減っていく 負のインデックスは末尾から先頭に向かって値が減っていく

 負の値のインデックスは、末尾の要素が「−1」、その直前の要素が「−2」、……のように末尾から先頭に向かって小さくなっていく。よって、末尾の要素を取り出すには「msg[-1]」と指定してやるのが一番簡単だ。

インデックス「-1」を指定して、末尾の要素を取り出す インデックス「-1」を指定して、末尾の要素を取り出す

 このように角かっこ「[]」にインデックスを指定することで文字列の要素を「取り出す」ことができる。だが、ここで注意しておきたいことが1つある。それは「文字列はその要素を変更できない」ことだ。つまり、「msg[0] = 'h'」のような操作は文字列では許可されていない。

文字列の要素は変更できない 文字列の要素は変更できない

文字列から指定した範囲の要素(部分文字列)を取得する:スライス

 上で見たように、インデックスは文字列から特定の要素を取り出すのに使える。だが、複数の要素を取り出すこともできる。これにはインデックス指定に似た形式で「[取り出す先頭要素のインデックス:取り出す最終要素のインデックス+1]」と指定する(2つのインデックスの間にコロン「:」があることに注意)。

  • 文字列[startindex:lastindex]
    startindex 取り出す先頭要素のインデックス(省略時は「0」と見なされる)
    lastindex 取り出す最終要素のインデックス+1(省略時は「len(その文字列)」と見なされる
    結果:指定した範囲に含まれる要素

 このような要素の取り出し方を「文字列のスライス」と呼ぶ。「取り出す先頭要素のインデックス」と「取り出す最終要素のインデックス+1」という組み合わせが覚えづらいという人は、以下の画像のようにインデックスの位置を各要素の左にズラしてみると分かりやすいかもしれない。これは「msg[1:4]」により文字列msgから取り出される文字の範囲を示したものだ。

インデックスの位置をズラしてみると、「1:4」というスライス指定は「1〜3番目の要素」を参照することになる インデックスの位置をズラしてみると、「1:4」というスライス指定は「1〜3番目の要素」を参照することになる

 上の画像にもある通り、変数msgに格納されている文字列の「1番目の要素」から「3番目の要素」を取り出すには「msg[1:4]」のように書く。コロン「:」の右には「取り出す最終要素のインデックス+1」を指定するので、ここでは「4」となる。それから、インデックスは0始まりであることを思い出そう。「1番目の要素」とは2文字目つまり「e」のことだ。

文字列のスライス 文字列のスライス

 このとき「取り出す先頭要素のインデックス」を省略すると0が指定されたものとして、「取り出す最終要素のインデックス+1」を省略すると「len(対象の文字列)」が指定されたものとして扱われる。例えば、「変数msgの0番目〜2番目の要素」を取り出すには「msg[:3]」と書く。同様に、「変数msgの2番目以降の要素を全て」取り出すには「msg[2:]」と書く。以下に例を示す。両方を省略する、つまり「[]」の中にコロン「:」だけを書けば、それは「[0:len(対象の文字列)」が指定されたことになるので、これはつまり文字列の全要素を取り出すことになる。以下に例を示す。

スライスによる文字列の要素の取り出し スライスによる文字列の要素の取り出し

 さらに、スライスの指定ではステップを指定することも可能だ。つまり、「[先頭:末尾:ステップ]」のように指定できる。この場合、先頭要素から最終要素までの範囲にある要素をステップで指定された数だけ飛ばしながら取り出していく。

  • 文字列[startindex:lastindex:step]
    startindex 取り出す先頭要素のインデックス(省略時は「0」と見なされる)
    lastindex 取り出す最終要素のインデックス+1(省略時は「len(文字列)」と見なされる
    step 何文字ごとに取り出すかの指定(省略時は「1」と見なされる。つまり各文字が取り出される)
    結果:指定した範囲に含まれる要素

 例えば、「msg[::2]」について考えてみよう。

「msg[::2]」が取り出す要素 「msg[::2]」が取り出す要素

 実際の実行結果を以下に示す。

実行結果 実行結果

 先頭要素と末尾要素が省略されているので、これは文字列の全体から「2つごと」に要素を取り出していくという意味になる。ステップの指定はちょっとトリッキーに思えるだろうが、先頭要素と末尾要素を指定した文字列のスライスは簡単に文字列から特定範囲の要素を取り出せるのでぜひ覚えておくようにしよう。

       1|2|3|4 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。