Pythonの文字列はさまざまに操作できる。文字数の取得、要素の取り出し、文字列に特定の文字列が含まれているかの判定、文字列の置換などを紹介する。
* 本稿は2019年4月19日、2022年5月18日に公開/改訂された記事を、Python 3.11.5で動作確認したものです(確認日:2023年9月11日)。
前回は文字列の種類や書き方などを見たが、文字列に対してさまざまな操作を行うことも可能だ。例えば、文字数を数えたり、文字列から指定した位置(インデックス)にある文字を取り出したり、文字列内に特定の文字列が含まれているかを調べたりできる。以下では、これらの操作について簡単に見ていこう。
文字数を数えるにはlen関数を使う。
使い方は簡単でlen関数に対象の文字列を渡すだけだ。戻り値がその文字数となる。以下に例を示す。
str_len = len('Hello World')
print(str_len)
msg = 'Good-bye World'
str_len = len(msg)
print(str_len)
実行結果は次の通り。
なお、len関数は文字列だけではなく、リストやタプルなど、複数の要素を格納するオブジェクトの要素数を得るのにも使える(リストについては第16回〜第18回で、タプルについては第19回で取り上げる)。
前回に述べたように、文字列とは文字が連なったものであり、文字列を構成する1つ1つの文字を「文字列の要素」と呼ぶ。そして、文字列を扱う際には、その要素を取り出したくなることもある。これには、文字列(や文字列を代入した変数)に角かっこ「[]」を続けて、その中に「取り出したい要素の文字列内での位置」を指定する。この「文字列内の位置」を「インデックス」と呼ぶ。
このとき、「インデックスは0始まり」であることに注意しよう。つまり、文字列の要素は「0文字目」「1文字目」……のように数えていく。
例えば、変数msgに格納されている先頭の文字を取り出すには「msg[0]」のように指定する。以下に例を示す。
msg = 'Hello'
print(msg[0])
実行結果を以下に示す。
では、ここで練習問題。上の変数msgの最後の文字を取り出すにはどのようにすればよいだろう。「Hello」の文字数は5文字なので、まずは「5」と指定してみよう。
エラーとなったことにビックリした人もいるかもしれない。だが、「インデックスは0始まり」であることを思い出そう。ということは、最後の要素のインデックスは「文字数−1」となる。よって、これは「msg[4]」とすることで取り出せる。
だが、文字列の長さが変わるたびに、最後の要素を取り出すのに文字数を目で数えるのは面倒だ。文字数を数えるのにはlen関数が使えることは既に述べた。よって、インデックスに「len関数の戻り値−1」を指定すれば、文字列がどんなものであっても最後の要素を取り出せるということだ。ただし、以下に示すように「msg[len(msg)-1]」と少し面倒な書き方になる。
もっと簡単な方法もある。Pythonではインデックスに負の値を指定できるのだ。
負の値のインデックスは、末尾の要素が「−1」、その直前の要素が「−2」、……のように末尾から先頭に向かって小さくなっていく。よって、末尾の要素を取り出すには「msg[-1]」と指定してやるのが一番簡単だ。
このように角かっこ「[]」にインデックスを指定することで文字列の要素を「取り出す」ことができる。だが、ここで注意しておきたいことが1つある。それは「文字列はその要素を変更できない」ことだ。つまり、「msg[0] = 'h'」のような操作は文字列では許可されていない。
上で見たように、インデックスは文字列から特定の要素を取り出すのに使える。だが、複数の要素を取り出すこともできる。これにはインデックス指定に似た形式で「[取り出す先頭要素のインデックス:取り出す最終要素のインデックス+1]」と指定する(2つのインデックスの間にコロン「:」があることに注意)。
このような要素の取り出し方を「文字列のスライス」と呼ぶ。「取り出す先頭要素のインデックス」と「取り出す最終要素のインデックス+1」という組み合わせが覚えづらいという人は、以下の画像のようにインデックスの位置を各要素の左にズラしてみると分かりやすいかもしれない。これは「msg[1:4]」により文字列msgから取り出される文字の範囲を示したものだ。
上の画像にもある通り、変数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(対象の文字列)」が指定されたことになるので、これはつまり文字列の全要素を取り出すことになる。以下に例を示す。
さらに、スライスの指定ではステップを指定することも可能だ。つまり、「[先頭:末尾:ステップ]」のように指定できる。この場合、先頭要素から最終要素までの範囲にある要素をステップで指定された数だけ飛ばしながら取り出していく。
例えば、「msg[::2]」について考えてみよう。
実際の実行結果を以下に示す。
先頭要素と末尾要素が省略されているので、これは文字列の全体から「2つごと」に要素を取り出していくという意味なる。ステップの指定はちょっとトリッキーに思えるだろうが、先頭要素と末尾要素を指定した文字列のスライスは簡単に文字列から特定範囲の要素を取り出せるのでぜひ覚えておくようにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.