HOWTO · Python
Pythonで文字列内の文字の位置を検索する方法
Pythonで文字列内の文字や部分文字列の位置を調べる方法を、最初・最後・すべての一致や見つからない場合の扱いとともに解説します。
このページの内容
Pythonの文字列インデックスは0から始まります。文字や部分文字列を検索するには、最初の一致にはfind()、最後の一致にはrfind()を使います。見つからない場合にValueErrorを発生させたいときはindex()を使います。find()とrfind()は、一致するものがないと-1を返します。一致する位置をすべて取得するには、enumerate()を使って反復します。以下のコード例は、提供されたPythonランタイムで実行されており、各セクションでは確認された結果を説明します。
これらのメソッドは文字列を検索し、大文字と小文字を区別します。検索する値に加え、省略可能なstartとendの範囲を指定できます。startの位置は検索対象に含まれ、endの位置は含まれません。たとえば、s.find("n", 6, 13)はインデックス6から12までの範囲だけを検索します。返される値は元の文字列の先頭から数えたインデックスであり、検索範囲内での相対位置ではありません。
find() メソッドで最初の一致を検索し、見つからない場合に対処する
文字列に対して、探したい文字または部分文字列を渡してfind()を呼び出します。このメソッドは、左から右へ検索して最初に一致した位置のインデックスを返します。値が見つからない場合は-1を返すため、その値をインデックスとして使う前に確認してください。
s = "python is fun"、c = "n"の場合、s.find(c)は5を返します。最初のnは、0始まりのインデックス5にあります。このメソッドの基本形はstring.find(substring, start, end)です。文字列全体を検索する場合は、省略可能な範囲指定を省きます。
最初の一致を検索する例を示します。
s = "python is fun"
c = "n"
print(s.find(c))
この例では、sの先頭から検索します。出力結果は5です。一致しない可能性がある場合は、position = s.find(c)で結果を受け取り、続けてif position != -1:のように条件を確認すると、見つからなかった場合を明示的に処理できます。
rfind() メソッドで最後の一致を検索する
文字や部分文字列が最後に現れる位置を調べるには、rfind()を使います。右から検索し、最も大きい一致インデックスを返します。ただし、インデックス自体は引き続き文字列の左端から数えます。find()と同様に、省略可能なstartとendの範囲を指定でき、一致するものがない場合は-1を返します。
同じ文字列と文字を使うと、s.rfind(c)は"python is fun"に最後に現れるnのインデックスである12を返します。基本形はstring.rfind(substring, start, end)です。
s = "python is fun"
c = "n"
print(s.rfind(c))
この例の結果は12です。最初の一致が必要ならfind()を、最後の一致が必要ならrfind()を選びます。どちらのメソッドも、検索対象がないという理由だけでエラーを発生させることはありません。
見つからない場合にエラーを発生させるindex()メソッド
index()も最初に一致した位置のインデックスを返し、同じ省略可能なstartとendの範囲を指定できます。find()との主な違いは、一致するものがない場合の動作です。文字や部分文字列が見つからないと、index()は-1を返す代わりにValueErrorを発生させます。見つからないことをエラーとして扱う場合はindex()を使い、戻り値で見つからなかったことを確認したい場合はfind()を使います。
s = "python is fun"、c = "n"の場合、s.index(c)は5を返します。基本形はstring.index(substring, start, end)です。
s = "python is fun"
c = "n"
print(s.index(c))
この例は最初のnを検索するため、結果は5です。一致しない場合にindex()がValueErrorを返すと説明しないでください。このメソッドは例外を発生させます。必要に応じて、呼び出し側でtry/except文を使って処理できます。
forループとenumerate()ですべての一致インデックスを検索する
find()、rfind()、index()はいずれも、一致した位置のインデックスを1つ返します。すべての出現位置を調べるには、文字列をenumerate()で反復します。enumerate()は各文字とその0始まりのインデックスを組み合わせて返します。検索する値と文字が一致したときに、そのインデックスを追加します。
s = "python is fun"
c = "n"
lst = []
for pos, char in enumerate(s):
if char == c:
lst.append(pos)
print(lst)
この文字列で一致する位置は[5, 12]です。2つのnはインデックス5と12にあります。同じ結果は、内包表記[pos for pos, char in enumerate(s) if char == c]でも求められます。別のループ本体が不要な場合に、反復と一致条件をまとめて記述できます。
どちらの方法も文字を順番に調べ、同じ0始まりのインデックスを使います。一致するたびに追加の処理を行う場合はループを、一致位置を集めることだけが目的ならリスト内包表記を選びます。