Pythonで文字列から特定の文字列の位置を検索する方法を解説します。
Contents
文字列から特定の文字列の位置を検索する方法
文字列の中に特定の文字列が含まれている場合に、その特定文字列の位置を検索したい場合があります。このような場合には、strクラスのfind, rfindまたはindex, rindexを使用することで、文字列から特定の文字列の位置を検索することができます。
findとindexはできることとしては同じですが、以下のように返却値に違いがあります。
- find, rfind:検索文字列が見つからなかった場合に-1を返却
- index, rindex:検索文字列が見つからなかった場合に例外(ValueError)を返却
なお、findやindexは文字列の前方から特定の文字列を検索しますが、rはreverseの意味なのでrfindやrindexは文字列の後方から逆に検索します。
本記事では、上記各メソッドを使って文字列から特定の文字列の位置を検索する方法を説明します。
find, rfindを使用する方法
基本的な使い方
find, rfindメソッドを使用して、対象の文字列から特定の文字列の位置を検索するには以下のように使用します。
sample_text = "Pythonプロジェクトを作ってPythonプログラミングを始めよう!" print(sample_text) # findで文字列を検索する print("--- find") print(sample_text.find("Python")) print(sample_text.find("プログラミング")) print(sample_text.find("JAVA")) # rfindで文字列を検索する print("--- rfind") print(sample_text.rfind("Python")) print(sample_text.rfind("プログラミング")) print(sample_text.rfind("JAVA"))
【実行結果】 Pythonプロジェクトを作ってPythonプログラミングを始めよう! --- find 0 22 -1 --- rfind 16 22 -1
findは前方から、rfindは後方から文字列を検索し、指定した特定の文字列が一致した場所の文字位置を返却します。なお、特定の文字列が対象の文字列に含まれていなかった場合には、findやrfindは-1を返却します。
上記例では、文字列の中に2つの”Python”という文字列があります。findメソッドを使用するか、rfindメソッドを使用するかで検索結果が異なっていることが分かるかと思います。
部分文字列を検索する場合
対象文字列内の部分文字列に対して検索をする場合には、以下のように検索する文字列の後に開始位置と終了位置を引数で指定します。
sample_text = "Pythonプロジェクトを作ってPythonプログラミングを始めよう!" print(sample_text) print(sample_text[6:29]) # findで部分文字列内を検索する print("--- find 部分文字列内") print(sample_text.find("Python", 6, 29)) print(sample_text.find("プログラミング", 6, 29)) print(sample_text.find("JAVA", 6, 29)) # rfindで文字列を検索する print("--- rfind 部分文字列内") print(sample_text.rfind("Python", 6, 29)) print(sample_text.rfind("プログラミング", 6, 29)) print(sample_text.rfind("JAVA", 6, 29))
【実行結果】 Pythonプロジェクトを作ってPythonプログラミングを始めよう! プロジェクトを作ってPythonプログラミング --- find 部分文字列内 16 22 -1 --- rfind 部分文字列内 16 22 -1
上記例では部分文字列を検索対象とするので、一番先頭の”Python”という文字列は検索に引っかからなくなります。
index, rindexを使う方法
基本的な使い方
index, rindexメソッドを使用して、対象の文字列から特定の文字列の位置を検索するには以下のように使用します。
sample_text = "Pythonプロジェクトを作ってPythonプログラミングを始めよう!" print(sample_text) # indexで文字列を検索する print("--- index") try: print(sample_text.index("Python")) print(sample_text.index("プログラミング")) print(sample_text.index("JAVA")) except ValueError as ex: print(ex) # rindexで文字列を検索する print("--- rindex") try: print(sample_text.rindex("Python")) print(sample_text.rindex("プログラミング")) print(sample_text.rindex("JAVA")) except ValueError as ex: print(ex)
【実行結果】 Pythonプロジェクトを作ってPythonプログラミングを始めよう! --- index 0 22 substring not found --- rindex 16 22 substring not found
indexは前方から、rindexは後方から文字列を検索し、指定した特定の文字列が一致した場所の文字位置を返却します。find, rfindメソッドでは、検索対象の文字列が対象の文字列に含まれない場合は-1を返却しましたが、index, rindexメソッドの場合は、ValueErrorの例外を返却します。
使い方はfind, rfindメソッドと同じです。指定の文字列が含まれていなかった場合には、ValueErrorの例外となるため、例外処理(try…except…)を使って処理をしています。
部分文字列を検索する場合
対象文字列内の部分文字列に対して検索をする場合には、以下のように検索する文字列の後に開始位置と終了位置を引数で指定します。
sample_text = "Pythonプロジェクトを作ってPythonプログラミングを始めよう!" print(sample_text) print(sample_text[6:29]) # indexで文字列を検索する print("--- index 部分文字列内") try: print(sample_text.index("Python", 6, 29)) print(sample_text.index("プログラミング", 6, 29)) print(sample_text.index("JAVA", 6, 29)) except ValueError as ex: print(ex) # rindexで文字列を検索する print("--- rindex 部分文字列内") try: print(sample_text.rindex("Python", 6, 29)) print(sample_text.rindex("プログラミング", 6, 29)) print(sample_text.rindex("JAVA", 6, 29)) except ValueError as ex: print(ex)
【実行結果】 Pythonプロジェクトを作ってPythonプログラミングを始めよう! プロジェクトを作ってPythonプログラミング --- index 部分文字列内 16 22 substring not found --- rindex 部分文字列内 16 22 substring not found
上記例では部分文字列を検索対象とするので、一番先頭の”Python”という文字列は検索に引っかからなくなります。
find, rfindとindex, rindexの使い分け
上記で対象文字列内の特定の文字列の位置を検索するためのfind, rfindメソッドとindex, rindexメソッドを紹介し、返却値に違いがあることを説明しました。この返却値の違いから、それぞれのメソッドは以下のような考え方で使い分けることができます。
- 条件分岐(if)で処理したい場合 ⇒ find, rfind
- 例外処理(try…except…)で処理したい場合 ⇒ index, rindex
文字列の中に特定の文字列が含まれるかどうかの判定
find, rfindやindex, rindexは対象文字列内の特定文字列の位置を検索する際に使用できますが、文字列の中に特定の文字列が含まれているかどうかを判定したいだけという場合は、in演算子を使用するようにしてください。
文字列の中に特定の文字列が含まれるかどうかの判定については「文字列の中に特定の文字列が含まれているかを判定する方法」にまとめていますので興味があれば参考にしてください。
まとめ
Pythonで文字列から特定の文字列の位置を検索する方法を解説しました。
メソッドとしては、find, rfindとindex, rindexが使用できます。それぞれのメソッドでは検索文字列が見つからなかった場合の返却値の違いがあります。
- find, rfind:検索文字列が見つからなかった場合に-1を返却
- index, rindex:検索文字列が見つからなかった場合に例外(ValueError)を返却
上記の返却値の違いから、条件分岐(if)で処理したい場合はfindやrfindを、例外処理(try…except…)で処理したい場合はindexやrindexを使用するようにしましょう。
また、文字列の中に特定の文字列が含まれているかどうかを判定したいだけという場合は、in演算子を使用するようにしてください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。