Pythonで文字列抽出【インデックスとスライス】
- 作成日: 2021-05-09
- 更新日: 2023-12-24
- カテゴリ: Python
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.+123
のa.+
は「a
で始まる任意の1つ以上の複数の文字」という意味です。
つまりa.+123
というパターンは「a
と123
で挟まれた任意の1つ以上の複数の文字」にマッチします。
その結果はabc123
という文字列が抽出されます。bc
が「任意の1つ以上の文字」に相当します。
文字列から数値部分を抽出したい場合は↓のようにします。
s = 'abc123def'
result = re.findall(r'\d+', s)
print(result[0])
# abc123
↑の場合、\d+
は「1つ以上の連続する整数」にマッチします。
その結果は123
という文字列が抽出されます。
おわりに
今回はPythonの文字列の抽出を見てみました。
文字列の抽出方法はリストやタプルなどにも応用できます。
一石三鳥、一度で三度おいしいとはこのことですね。
🦝 < 一石三鳥!打率30割!
🐭 < イチローもびっくり