Developer

【Python独学】文字の取り出しとスライス
2020.11.02
Lv1

【Python独学】文字の取り出しとスライス

文字列から文字を取り出す

今回は、文字列からある1文字や文字列を取り出す方法について扱っていきます。


前回の記事ではPythonでの文字列の扱いについて取り上げました。
文字列はいくつかの文字で構成されています。
ある文字列の中から、特定の文字を取り出す際は [] を使います。

文字列[文字の位置]

例えば、”Python”という文字列から3文字目を取り出すには、以下のように記述します。

word = "Python"
print(word[2])
C:\Python> python 2-4.py
t
[]には、取り出したい文字が文字列内のどこに位置するかを数値で指定します。

この数値のことをインデックスと呼びます。

インデックスは、0から始まります。
なので、3文字目を取り出す場合は、インデックスに2を指定します。
以下のように、インデックスを変えて出力結果を確認してみましょう。

word = "Python"
print(word[1])
print(word[3])
print(word[5])
C:\Python> python 2-4.py
y
h
n

インデックスを使えば、文字列の中から特定の位置にある文字を取り出すことができます。
ただし、ある位置にある文字に対して別の文字を代入し、文字列を変更することはできません。
Pythonで扱うデータには、変更可能(ミュータブル)なものと、変更不可能(イミュータブル)なものが存在します。
文字列は変更不可能なデータなので、インデックスを指定して文字を変更しようとすると
以下のようにエラーになります。

word = "Python"
word[1] = "x"
C:\Python> python 2-4.py
Traceback (most recent call last):
File “.\2-4.py”, line 2, in
word[1] = “x”
TypeError: ‘str’ object does not support item assignment

Pythonのデータの変更可能・不可能については、今の時点で深く知る必要はありません。
文字列は変更不可能なデータである、ということだけ覚えておきましょう。

また、文字列の長さを超えるインデックスを指定した場合もエラーになります。

word = "Python"
print(word[100])
C:\Python> python 2-4.py
Traceback (most recent call last):
File “.\2-4.py”, line 2, in
print(word[100])
IndexError: string index out of range

インデックスに負の値を指定すると、文字列の一番後ろの文字を-1として、
後ろから数えた順にインデックスを指定する事ができます。
以下のように、インデックスに負の値を指定して確認してみましょう。

word = "Python"
print(word[-1])
print(word[-3])
print(word[-5])
C:\Python> python 2-4.py
n
h
y

まとめると、文字列とインデックスの関係は以下のようになります。

インデックス 0 1 2 3 4 5
文字列 P y t h o n
インデックス(負の値) -6 -5 -4 -3 -2 -1

文字列から文字列の一部を取り出す

文字列からある位置の1文字を取り出す方法を説明しました。
次に、文字列の中から文字列の一部を取り出す方法を説明します。
以下のように、抜き出す文字列の先頭の文字のインデックスと、
最後の文字のインデックスに1を加えた値を指定します。

文字列[開始インデックス:終了インデックス]

この操作は、スライスと呼ばれます。
例えば、ある文字列の2番目の文字から4番目の文字までを取り出すには、以下のように記述します。

word = "0123456789"
print(word[1:5])
C:\Python> python 2-4.py
1234

開始インデックスと終了インデックスは省略することができます。
それぞれ省略した場合、開始インデックスは0と見なされます。
終了インデックスはその文字列の最後のインデックスと見なされます。
以下の例で確認してみましょう。

word = "0123456789"
print(word[2:])   #終了インデックスを省略した場合
print(word[:7])   #開始インデックスを省略した場合
print(word[:])    #両方省略した場合
C:\Python> python 2-4.py
23456789
0123456
0123456789

以上のように、終了インデックスを省略した場合は開始インデックスから最後まで、
開始インデックスを省略した場合は最初から終了インデックスまでを取り出します。
両方を省略した場合は最初から最後まで、つまり文字列全体を表します。

1文字を取り出す場合と違い、文字列の長さを超えたインデックスを指定してもエラーにはなりません。
例えば、終了インデックスに文字列の長さを超えた値を指定した場合、文字列の最後のインデックスとして扱われます。

word = "0123456789"
print(word[:100])
C:\Python> python 2-4.py
0123456789

スライスでは、3番目の値を指定することで1文字おき、2文字おきといったかたちで
飛び飛びに文字を取り出すことが出来ます。
この増分をステップと呼ぶ場合があります。

文字列[開始インデックス:終了インデックス:ステップ]

以下のように記述すると、1文字目、4文字目、7文字目、10文字目を取り出します。

word = "0123456789"
print(word[::3])
C:\Python> python 2-4.py
0369

開始インデックスと終了インデックスで範囲を指定することも出来ます。

word = "0123456789"
print(word[2:9:2])
C:\Python> python 2-4.py
2468

ステップに負の値を指定すると、文字を後ろから取り出すこともできます。
例えば、-1 を指定した場合文字列の後ろから順に取り出すことになるので、
元の文字列と逆向きの文字列を取り出すことができます。
範囲を指定し、ステップに負の値を指定して文字列を逆向きに取り出す場合は、
開始インデックスと終了インデックスの指定に注意しましょう。
逆向きに取り出す場合は、開始インデックスより終了インデックスのほうが小さくなるように指定します。
通常の範囲指定と同じように指定すると、空文字列が返ります。

word = "0123456789"
print(word[::-1])
print(word[1:5:-1])   #終了インデックスが開始インデックスより大きいので空文字列が返る
print(word[5:1:-1])   #逆向きの文字列が返る
C:\Python> python 2-4.py
9876543210

5432


まとめ

文字列の中からある位置の文字列を取り出すには、インデックスを用います。

文字列[インデックス]

文字列から文字列を取り出す際は、開始インデックスと終了インデックスを指定します。
この操作をスライスと呼びます。

文字列[開始インデックス:終了インデックス]

3番目の値を指定することで、2文字おき、3文字おきといったかたちで飛び飛びに文字を取り出すことができます。
この値をステップと呼ぶ場合があります。

文字列[開始インデックス:終了インデックス:ステップ]

確認問題

1.以下の文字列の2,4,6文字目をそれぞれ取り出してみましょう。
word = “Hello,Python”

2.以下の文字列の3文字目から11文字目までの文字列を逆向きに取り出してみましょう。
word = “0123456789abcde”

連載目次

独学で学ぶ Pythonプログラミング 連載目次