Pythonで文字列抽出【インデックスとスライス】

246, 2021-05-10

目次

Pythonで文字列抽出

Pythonには文字列というデータ型がありますが、この文字列からさらに特定の文字列を抽出する方法をこの記事では解説しています。
具体的には文字列のインデックスとスライスを使うことで文字列から文字列を抽出することが可能です。

インデックスとスライスは文字列に限らず他のデータ型(リストやタプル)などでも利用できる汎用的なテクニックです。
これらの技術を覚えることで一石三鳥でPtyhonを使いこなすことが出来るようになります。

結論から言うとインデックスとスライスは↓のように使います。

s = 'abc123def'

print(s[2])  # インデックスで2番目の要素を参照
# c

print(s[3:6])  # スライスで'123'を抽出する
# 123

この記事では具体的に↓を見ていきます。

  • インデックスによる文字列の抽出

  • スライスによる文字列の抽出

  • 正規表現による文字列の抽出

インデックスによる文字列の抽出

文字列はインデックスで参照することができます。
インデックスとは添え字のことで、これは整数です。
文字列に角カッコをつけてインデックスで参照することで、そのインデックスの文字列を参照することができます。

s = 'abc123def'

print(s[0])  # 0番目の要素(a)を参照
# a

print(s[1])  # 1番目の要素(b)を参照
# b

print(s[2])  # 0番目の要素(c)を参照
# c

インデックスは0ベースでカウントされます。
つまり1文字目の文字を参照したい時は0番というインデックス、2文字目の文字を参照したい時は1番というインデックスを使います。

インデックスで参照した結果は文字列で返ってきます。文字を参照してもそれは文字ではなく文字列です。

c = s[0]
print(type(c))
# <class 'str'>

つまり文字列は再帰的に角カッコとインデックスで参照していくことができます。

print(s[0][0][0])
# a

しかし、↑のような再帰的な参照にはあまり意味がないかもしれないですね。

意味ないよね、じっさい

インデックスに負数を使うと文字列の末尾から要素を参照していくことができます。
-1を指定した場合は一番最後の文字を参照します。

c = s[-1]
print(c)
# f

for文ですべての文字を参照

インデックスですべての文字をfor文で参照するには↓のようにします。

s = 'abc123def'
for i in range(len(s)):
    print(s[i])

# a
# b
# c
# 1
# 2
# 3
# d
# e
# f

文字列の長さはlen()で得ることができます。
この長さだけfor文で回して、その添え字を文字列に使うとすべての文字を参照することができます。

スライスによる文字列の抽出

スライスとは角カッコ内にコロンをつけることです。
スライスは文字列から「特定の範囲の文字列」を抽出したいときに使います。
スライスの構造は↓のようになっています。

[開始点:終了点:ステップ数]

開始点には抽出を始めるインデックスを指定します。
終了点には抽出を終わるインデックスを指定します。
ステップ数には抽出を実行するステップを指定します。デフォルトでは1になります。
↑の内、開始点、終了点、ステップ数はそれぞれ省略できます。

たとえば文字列の3から6までの範囲で文字列を抽出したい場合は↓のようにします。

s = 'abc123def'

result = s[3:6]
print(result)
# 123

終了点についての注意ですが、終了点は「以下」ではなく「より下」になります。
終了点自体の要素は抽出範囲にならないので注意してください。

開始点を設定し、終了点を省略した場合は、開始点から末尾まで抽出されます。

result = s[3:]
print(result)
# 123def

開始点を省略し、終了点を設定した場合は、先頭から終了点まで抽出されます。

result = s[:3]
print(result)
# abc

ステップ数を設定した場合はそのステップ間隔で文字が抽出されます。

result = s[::3]
print(result)
# a1d

↑の場合は開始点と終了点を省略しているので、文字列の先頭から末尾まで抽出されます。
そして、ステップ数を3にしているので0, 3, 6のインデックスの文字が抽出されます。

ちなみに開始点、終了点、ステップ数をすべて省略した場合は文字列のコピーが返ってきます。

result = s[::]
print(result)
# abc123def

正規表現による文字列の抽出

文字列の抽出でよく使われるのが正規表現を使った抽出です。
ここでは正規表現の詳細な使い方については解説しませんが、ざっくりとした解説は行います。

re.findall()を使った抽出

re.findall()の第1引数にパターン、第2引数にテキストを指定すると、パターンにマッチしたテキストを抽出することができます。

import re

s = 'abc123def'
result = re.findall(r'a.+123', s)
print(result[0])
# abc123

re.findall()は返り値としてリストを返してきます。
マッチしたテキストはこのリスト内に保存されます。
↑の例では「a.+123」というパターンにマッチしたabc123という文字列が抽出されています。

a.+123a.+は「aで始まる任意の1つ以上の複数の文字」という意味です。
つまりa.+123というパターンは「a123で挟まれた任意の1つ以上の複数の文字」にマッチします。
その結果はabc123という文字列が抽出されます。bcが「任意の1つ以上の文字」に相当します。

文字列から数値部分を抽出したい場合は↓のようにします。

s = 'abc123def'
result = re.findall(r'\d+', s)
print(result[0])
# abc123

↑の場合、\d+は「1つ以上の連続する整数」にマッチします。
その結果は123という文字列が抽出されます。

おわりに

今回はPythonの文字列の抽出を見てみました。
文字列の抽出方法はリストやタプルなどにも応用できます。
一石三鳥、一度で三度おいしいとはこのことですね。

一石三鳥!打率30割!

イチローもびっくり