文字列

【Python】文字列から特定の文字列の位置を検索する方法

【Python】文字列から特定の文字列の位置を検索する方法

Pythonで文字列から特定の文字列の位置を検索する方法を解説します。

文字列から特定の文字列の位置を検索する方法

文字列の中に特定の文字列が含まれている場合に、その特定文字列の位置を検索したい場合があります。このような場合には、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”という文字列は検索に引っかからなくなります。

Note

findの公式ドキュメントはこちらを参照してください。
rfindの公式ドキュメントはこちらを参照してください。

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”という文字列は検索に引っかからなくなります。

Note

indexの公式ドキュメントの記載はこちらを参照してください。
rindexの公式ドキュメントはこちらを参照してください。

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演算子を使用するようにしてください。