Python 3で文字列をインデックス付けおよびスライスする方法
紹介
Pythonの文字列データ型は、文字、数字、空白文字、または記号から構成される1つ以上の個々の文字でできたシーケンスです。文字列はシーケンスであるため、他のシーケンスベースのデータ型と同様に、インデックス付けやスライスを通じてアクセスできます。
このチュートリアルでは、インデックスを通じて文字列にアクセスする方法、文字シーケンスをスライスする方法、いくつかのカウントと文字の位置を特定するメソッドについて説明します。
前提条件
Python 3がインストールされていて、コンピュータまたはサーバーにプログラミング環境がセットアップされている必要があります。プログラミング環境がセットアップされていない場合は、オペレーティングシステム(Ubuntu、CentOS、Debianなど)に適したローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照できます。
文字列のインデックスの付け方
リストデータ型にアイテムがインデックス番号に対応しているのと同様に、文字列の各文字もインデックス番号に対応しており、インデックス番号は0から始まります。
サミー・シャーク! のインデックスの内訳は次のようになります:
| S | A | m | m | y | S | h | A | r | k | ! | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
ご覧のように、最初のSはインデックス0から始まり、文字列はインデックス11で!記号で終了します。
私たちはまた、SammyとSharkの間の空白文字がそれ自身のインデックス番号と対応していることにも気づきました。この場合、空白に関連付けられたインデックス番号は5です。
感嘆符(!)には関連するインデックス番号もあります。他の記号や句読点、例えば*#$&.;?も文字の一種であり、それぞれのインデックス番号に関連付けられています。
Pythonの文字列の各文字には対応するインデックス番号があるという事実は、他の連続データ型と同じ方法で文字列にアクセスし、操作することを可能にします。
正のインデックス番号による文字へのアクセス
インデックス番号を参照することで、文字列の中から1つの文字を特定することができます。インデックス番号を角括弧に入れることでこれを行います。では、文字列を宣言し、それを印刷し、角括弧内のインデックス番号を呼び出してみましょう。
情報:このチュートリアルの例コードに従うには、ローカルシステムで python3 コマンドを実行して Python インタラクティブシェルを開きます。そして、>>> プロンプトの後に例をコピー、貼り付け、または編集することができます。
ss = "Sammy Shark!"
print(ss[4])
y
文字列の特定のインデックス番号を参照すると、Pythonはその位置にある文字を返します。文字 y は文字列 ss="Sammy Shark!" のインデックス番号4にあるため、ss[4] を印刷すると、出力として y が得られます。
インデックス番号を使用すると、文字列内の特定の文字にアクセスできます。
負のインデックス番号による文字へのアクセス
長い文字列があり、最後の方にあるアイテムを特定したい場合、文字列の末尾から逆に数えることもでき、インデックス番号-1から始めることができます。
同じ文字列Sammy Shark!の負のインデックスの breakdown は次のようになります:
| S | A | m | m | y | S | h | A | r | k | ! | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
負のインデックス番号を使用することで、-3インデックスの位置を参照して文字 r を出力することができます。次のように:
print(ss[-3])
r
負のインデックス番号を使用することは、長い文字列の末尾に近い単一の文字を孤立させるのに有利です。
文字列をスライスする
文字列から一連の文字を呼び出すこともできます。例えば、Sharkという単語だけを印刷したいとしましょう。そのためには、元の文字列内の文字のシーケンスであるスライスを作成します。スライスを使用すると、コロン[x:y]で区切られたインデックス番号の範囲を作成することで、複数の文字値を呼び出すことができます。
print(ss[6:11])
Shark
スライスを構築する際、[6:11] のように、最初のインデックス番号はスライスの開始位置(含む)であり、2 番目のインデックス番号はスライスの終了位置(除外)です。そのため、上記の例では、範囲は文字列の終了後に現れるインデックス番号でなければなりません。
文字列をスライスするとき、私たちはサブストリングを作成しています。これは基本的に別の文字列の中に存在する文字列です。ss[6:11]を呼び出すと、文字列Sammy Shark!の中に存在するサブストリングSharkを呼び出しています。
文字列の両端を含めたい場合、string[n:n]構文のいずれかの数字を省略することができます。たとえば、文字列ssの最初の単語である「サミー」を表示したい場合、次のように入力できます:
print(ss[:5])
Sammy
私たちは、スライス構文においてコロンの前にインデックス番号を省略し、コロンの後のインデックス番号のみを含めることでこれを行いました。このインデックス番号は、部分文字列の終わりを指します。
文字列の中間から始まり最後まで印刷する部分文字列を印刷するには、コロンの前にインデックス番号のみを含めることで実行できます。
print(ss[7:])
hark!
コロンの前にインデックス番号のみを含め、2番目のインデックス番号を構文から省略することにより、部分文字列は呼び出されたインデックス番号の文字から文字列の最後までになります。
文字列をスライスするために、負のインデックス番号を使用することもできます。以前に話したように、文字列の負のインデックス番号は-1から始まり、そこから文字列の始まりに達するまでカウントダウンします。負のインデックス番号を使用する場合、文字列の中で先に現れる低い数字から始めます。
文字列 ss をスライスするために、2つの負のインデックス番号を使いましょう:
print(ss[-4:-1])
ark
文字列「サミーシャーク!」から部分文字列「アーク」が印刷されるのは、文字「a」が-4のインデックス番号位置にあり、文字「k」が-1のインデックス番号位置の前にあるためです。
文字列をスライスする際にストライドを指定する
文字列スライシングは、2つのインデックス番号に加えて、3番目のパラメータを受け入れることができます。3番目のパラメータはストライドを指定し、これは文字列から最初の文字が取得された後にいくつの文字を進めるかを示します。これまで、ストライドパラメータを省略しており、Pythonではストライドが1にデフォルト設定されているため、2つのインデックス番号の間のすべての文字が取得されます。
上記の例を見直して、サブストリング「シャーク」を出力する部分を確認しましょう:
print(ss[6:11])
Shark
ステップを1に設定した3番目のパラメータを含めることで、同じ結果を得ることができます。
print(ss[6:11:1])
Shark
つまり、1のストライドはスライスの2つのインデックス番号の間にあるすべての文字を取得します。ストライドのパラメータを省略すると、Pythonはデフォルトで1になります。
もし代わりにストライドを増やすと、文字がスキップされるのがわかります。
print(ss[0:12:2])
SmySak
Pythonの構文ss[0:12:2]で最後のパラメータに2のストライドを指定すると、すべての他の文字がスキップされます。強調されている文字を確認しましょう:
サミー・シャーク!
インデックス番号5の空白文字も、指定されたストライド2でスキップされることに注意してください。
ストライドパラメータに大きな数値を使用すると、かなり小さい部分文字列が得られます。
print(ss[0:12:4])
Sya
Pythonの構文ss[0:12:4]で最後のパラメータに4のストライドを指定することで、毎回4番目の文字だけが表示されます。改めて、強調された文字を見てみましょう:
サミー・シャーク!
この例では、空白文字もスキップされます。
全体の文字列を印刷しているため、2つのインデックス番号を省略し、構文内に2つのコロンを残して同じ結果を得ることができます:
print(ss[::4])
Sya
2つのインデックス番号を省略し、コロンを保持すると、全体の文字列を範囲内に保つことができます。一方、ストライドの最終パラメーターを追加すると、スキップする文字の数を指定できます。
さらに、ストライドに負の数値を指定することもでき、ストライドを-1に設定すると元の文字列を逆順に印刷するのに使用できます:
print(ss[::-1])
!krahS ymmaS
指定されたパラメータのない2つのコロンは、元の文字列のすべての文字を含むことになり、ストライド1はスキップせずにすべての文字を含み、そのストライドを否定すると文字の順序が逆になる。
これをもう一度やりましょうが、ストライドを-2にしましょう:
print(ss[::-2])
!rh ma
この例では、ss[::-2]、パラメータにインデックス番号が含まれていないため、元の文字列全体を扱っており、負のストライドを使って文字列を反転させています。さらに、ストライドが-2であるため、反転した文字列のすべての他の文字をスキップしています。
クラスへようこそ!
この例では空白文字が印刷されます。
Pythonのスライス構文の第三のパラメータを指定することで、元の文字列から取り出す部分文字列のストライドを示しています。
カウント方法
文字列内の文字に対応する関連インデックス番号を考えている間、文字列をカウントしたりインデックス番号を返したりするいくつかのメソッドについて考慮する価値があります。これは、ユーザー入力フォーム内で受け入れたい文字の数を制限したり、文字列を比較したりする際に役立ちます。他の逐次データ型と同様に、文字列もいくつかの方法でカウントすることができます。
最初に、文字列、リスト、タプル、および辞書を含む、順序付けられているか無順序かにかかわらず、任意のシーケンスデータ型の長さを取得できる len() メソッドを見ていきましょう。
文字列 ss の長さを印刷しましょう:
print(len(ss))
12
文字列「サミーシャーク!」の長さは、空白文字と感嘆符を含めて12文字です。
変数を使用する代わりに、文字列を直接len()メソッドに渡すこともできます:
print(len("Let's print the length of this string."))
38
len() メソッドは、文字列内の文字数の合計をカウントします。
特定の文字または文字列が文字列に出現する回数を数えたい場合、str.count() メソッドを使用できます。私たちの文字列 ss="サミーシャーク!" を使って、文字 “a” が出現する回数を数えてみましょう:
print(ss.count("a"))
2
別のキャラクターを探すことができます:
print(ss.count("s"))
0
文字列に「S」という文字が含まれているにもかかわらず、各文字は大文字と小文字が区別されることを念頭に置くことが重要です。大文字小文字に関係なく文字列内のすべての文字を検索したい場合、まず文字列をすべて小文字に変換するためにstr.lower()メソッドを使用できます。このメソッドについては、「Python 3における文字列メソッド入門」で詳しく読むことができます。
文字のシーケンスで str.count() を試してみましょう:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
3
文字列 likes の中で、「likes」と同等の文字の並びが元の文字列に3回現れます。
文字や文字列が文字列の中でどの位置にあるかを見つけることもできます。これはstr.find()メソッドを使って行うことができ、インデックス番号に基づいて文字の位置を返します。
文字列ss内で最初の「m」がどこにあるか確認できます:
print(ss.find("m"))
Ouput2
最初の文字「m」は、文字列「Sammy Shark!」のインデックス位置2に出現します。上の文字列ssのインデックス番号位置を確認できます。
文字列 likes の中で最初に「likes」という文字列がどこにあるかを確認しましょう。
print(likes.find("likes"))
Ouput6
文字列「likes」の最初の出現は、インデックス番号6の位置で始まり、ここがシーケンス「likes」の文字lが位置するところです。
もし、私たちが「いいね」の二回目のシーケンスが始まる場所を見たい場合、特定のインデックス番号から始める第2のパラメータをstr.find()メソッドに渡すことで、それが可能です。したがって、文字列の先頭ではなく、インデックス番号9の後から始めましょう:
print(likes.find("likes", 9))
34
この2番目の例では、インデックス番号9から始まり、文字列「likes」の最初の出現はインデックス番号34から始まります。
さらに、範囲の終わりを第三のパラメータとして指定することもできます。スライスと同様に、負のインデックス番号を使って逆方向に数えることで指定することができます:
print(likes.find("likes", 40, -6))
64
この最後の例では、インデックス番号40と-6の間にあるシーケンス「likes」の位置を検索します。最後に入力されたパラメータが負の数であるため、元の文字列の末尾から数えます。
len()、str.count()、およびstr.find()の文字列メソッドは、文字列の長さ、文字や文字列の出現回数、文字や文字列のインデックス位置を決定するために使用できます。
結論
文字列の特定のインデックス番号や、文字列の特定のスライスを呼び出すことができると、データ型を扱う際の柔軟性が向上します。文字列はリストやタプルと同様にシーケンスベースのデータ型であるため、インデックス指定やスライスを通じてアクセスできます。
文字列のフォーマットや文字列メソッドについてもっと読むことで、文字列に関する学習を続けることができます。