Pythonで文字列から部分文字列を抽出する幾つかの方法の中から、基本的といえるインデックス指定やスライス指定を行う方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
# インデックス指定による文字の抽出
s = '0123456789'
r = s[3] # 文字列sのインデックス3にある文字を抽出(インデックスは0始まり)
print(r) # 3
r = s[-2] # 文字列sの後ろから2番目の文字を抽出(文字列末尾は-1)
print(r) # 8
r = s[100] # 範囲外を指定するとIndexError例外
# スライス指定による文字列の抽出
s = '0123456789'
r1 = s[::] # 文字列全体
r2 = s[:] # 文字列全体(2つ目のコロンを省略)
print(r1) # 0123456789
print(r2) # 0123456789
# 連続する範囲の抽出
r = s[0:2] # 文字列sのインデックス位置0〜1にある要素を抽出
print(r) # 01
r = s[9:10] # 範囲外を指定しても例外にはならない
print(r) # 9
r = s[10:100] # 範囲外を指定しても例外にはならない
print(r) # ''(空文字列)
# 指定したインデックス以前/指定したインデックス以降の要素を抽出
r = s[5:] # 文字列sのインデックス5以降を抽出
print(r) # 56789
r = s[:3] # 文字列sのインデックス2までの要素を抽出
print(r) # 012
# 開始位置/終了位置に負値を指定して抽出
r = s[-5:-1] # 文字列sの-5〜-2番目(インデックス5〜末尾の直前)の要素を抽出
print(r) # 5678
r1 = s[-1:-8] # 開始位置が終了位置よりも末尾に近いときには何も得られない
r2 = s[-8:-1] # 開始位置が終了位置よりも先頭に近いので文字列が得られる
print(r1) # ''
print(r2) # 2345678
# 増分を指定して飛び飛びの要素の抽出
r = s[5:9:2] # 文字列のインデックス5〜9の範囲で2文字ごとに抽出
print(r) # 57
r = s[-1:-6:-2] # 文字列末尾からインデックス-6の範囲で2文字ごとに抽出
print(r) # 975
r = s[3::3] # 文字列のインデックス3から3文字ごとに抽出
print(r) # 369
r = s[:9:3] # 文字列先頭からインデックス9までの範囲で3文字ごとに抽出
print(r) # 036
r = s[::-1] # 文字列全体を逆順に並べ替え
print(r) # 9876543210
文字列から部分文字列を抽出するには幾つかの方法がある。本稿ではインデックスやスライスを使用して指定した位置/範囲にあるものを抽出する方法を紹介する。正規表現を使用して、指定したパターンにマッチする文字列を抽出する方法については別稿で紹介する。なお、文字列のインデックスやスライスの詳細については「Python入門」の「文字列の操作」を参照されたい。
インデックスを指定して文字列から特定の1文字を抽出するには、抽出しようとしている文字のインデックスを大かっこ「[]」に囲んで指定する。
以下に例を示す。
s = '0123456789'
r = s[3] # 文字列sのインデックス3にある文字を抽出(インデックスは0始まり)
print(r) # 3
r = s[-2] # 文字列sの後ろから2番目の文字を抽出(文字列末尾は-1)
print(r) # 8
r = s[100] # 範囲外を指定するとIndexError例外
インデックスは0始まりという点には注意すること。上の文字列s('0123456789')であれば文字列先頭の文字「0」のインデックスは0である。最初の例ではインデックスに「3」を指定しているが、これによりインデックス3、つまり4つ目の文字「3」が抽出される。
2つ目の例にあるように、インデックスには負値を指定することもできる。インデックス-1は文字列末尾を表し、インデックス-2はその1つ前の文字を表す。よって、2つ目の例では文字列末尾から2文字目の文字である「8」が取り出されている。
3つ目の例にある通り、文字列の範囲外のインデックスを指定するとIndexError例外が発生する。
インデックス指定では文字列中の指定した位置にある1文字が抽出されるが、指定した範囲にある0個以上の文字を抽出するにはスライスを使用する。スライスは「[start:end:step]」 のように大かっこの中にスライスの開始位置(start)、終了位置(end)、増分(step)をコロン「:」で区切って指定する。ただし、これらは全て省略可能であり、全てを省略した場合には文字列全体が取り出される。また、増分を指定しないときには2つ目のコロンも省略できる(1つ目のコロンは省略できない)。
s = '0123456789'
r1 = s[::] # 文字列全体
r2 = s[:] # 文字列全体(2つ目のコロンを省略)
print(r1) # 0123456789
print(r2) # 0123456789
開始位置(start)を省略したときには0が、終了位置(end)を指定したときには「文字列の長さ」が、増分(step)を指定したときには1が指定されたものと考えられる。よって、上の2つのスライス指定はいずれも「start=0、stop=len(s)、step=1」つまり文字列を先頭から全て抽出することを意味する。
基本的には、スライスでは「index=start+step×n」という式でインデックスを計算して、「start ≦ index < end」(stepが負の値であれば「end < index ≦ start」)の範囲に含まれるインデックスに対応する文字が得られる。ただし、終了位置(end)に指定した値をインデックスとする要素については取得されない点には注意しよう。
なお、増分に負の値を指定しない場合、開始位置が終了位置よりも末尾に近いと空文字列が返される(増分に負の値を指定した場合は逆に、開始位置が終了位置よりも先頭に近いと空文字列が返される)。
以下に幾つかの例を示す。
s = '0123456789'
# 連続する範囲の抽出
r = s[0:2] # 文字列sのインデックス位置0〜1にある要素を抽出
print(r) # 01
r = s[9:10] # 範囲外を指定しても例外にはならない
print(r) # 9
r = s[10:100] # 範囲外を指定しても例外にはならない
print(r) # ''(空文字列)
# 指定したインデックス以降/指定したインデックス以前の要素を抽出
r = s[5:] # 文字列sのインデックス5以降の要素を抽出
print(r) # 56789
r = s[:3] # 文字列sのインデックス2までの要素を抽出
print(r) # 012
これらは増分(step)を省略しているので「1」が指定されたものとして考えられる。よって、連続する範囲が抽出される。最初の例では、スライスを「s[0:2]」と指定しているが、終了位置の「2」の要素が抽出された文字列には含まれていないことに注目しよう。既に述べたが、終了位置として指定した値をインデックスとする要素はスライスには含まれない。
Copyright© Digital Advantage Corp. All Rights Reserved.