[解決!Python]文字列から部分文字列を検索するには(in演算子、find/index/count/startswith/endswithメソッド)解決!Python

文字列に特定の部分文字列が含まれているか、そのインデックスはどこか、何個含まれているかなどを調べる方法を紹介する。

» 2021年01月12日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 文字列中に特定の部分文字列が存在するかどうかを調べる
s = 'this is a sample string'
result = 'is' in# 文字列sに'is'が含まれているかどうか
print(result)  # True
result = 'foo' in# 文字列sに'foo'が含まれているかどうか
print(result)  # False
result = 'is' not in# 文字列sに'is'が含まれていないかどうか
print(result)  # False
result = 'foo' not in# 文字列sに'foo'が含まれていないかどうか
print(result)  # True

# 文字列中で特定の部分文字列が存在するインデックスを取得(例外を発生しない)
s = 'this is a sample string'
idx = s.find('is'# 'is'があるインデックスを取得(前方検索)
print(idx)  # 2('this'の'is'が該当)
idx = s.rfind('is'# 'is'があるインデックスを取得(後方検索)
print(idx)  # 5

idx = s.find('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(idx)  # 5

idx = s.find('foo'# 文字列が見つからなければ-1が返される
print(idx)  # -1

# 文字列中で特定の部分文字列が存在するインデックスを取得(例外を発生する)
s = 'this is a sample string'
idx = s.index('is'# 'is'があるインデックスを取得(前方検索)
print(idx)  # 2('this'の'is'が該当)
idx = s.rindex('is'# 'is'があるインデックスを取得(後方検索)
print(idx)  # 5

idx = s.index('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(idx)  # 5

idx = s.index('foo'# ValueError:文字列が見つからなければ例外が発生する

# 文字列中に特定の部分文字列が何個含まれているかを調べる
s = 'this is a sample string'
cnt = s.count('is'# 文字列sに'is'が何個含まれているか
print(cnt)  # 2

cnt = s.count('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(cnt)  # 1

# 文字列が特定の文字列で始まっているかどうか/終わっているかどうかを調べる
s = 'this is a sample string'
result = s.startswith('this'# 文字列sが'this'で始まっているかどうか
print(result)  # True
result = s.endswith('this'# 文字列sが'this'で終わっているかどうか
print(result)  # False


文字列中に特定の部分文字列が存在するかどうかを調べる

 文字列中に特定の文字列(部分文字列)が含まれているかどうか(含まれていないかどうか)を調べる(存在確認を行う)にはin演算子とnot in演算子を使う。前者は含まれていればTrueを含まれていなければFalseを返す。後者はその逆だ。

s = 'this is a sample string'
result = 'is' in# 文字列sに'is'が含まれているかどうか
print(result)  # True
result = 'foo' in# 文字列sに'foo'が含まれているかどうか
print(result)  # False
result = 'is' not in# 文字列sに'is'が含まれていないかどうか
print(result)  # False
result = 'foo' not in# 文字列sに'foo'が含まれていないかどうか
print(result)  # True


 上の例を見れば分かる通り、これらの演算子はTrue/Falseのいずれかを返す。あくまでも文字列に、特定の部分文字列が含まれているかどうかを調べることしかできないことには注意しよう。部分文字列がどこにあるか、そのインデックスを調べるにはこの後で紹介するfind/rfind/index/rindexメソッドを使う。

文字列中で特定の部分文字列が存在するインデックスを取得

 文字列中に特定の部分文字列が存在する箇所(インデックス)を調べるにはfind/rfind/index/rindexメソッドを使用する。まずはfindメソッドとrfindメソッドについて見ていこう。

 find/rfindメソッドは引数に検索したい部分文字列と検索開始位置、検索終了位置を取る。ただし、検索開始位置と検索終了位置は省略できる(ただし、検索終了位置を指定する場合は検索開始位置も指定する必要がある)。検索範囲は「文字列[検索開始位置:検索終了位置]」というスライスで表せる。findメソッドはその検索範囲を先頭(インデックスの小さい方)から検索していく。rfindメソッドは検索範囲の末尾(インデックスの大きい方)から検索する。また、指定した部分文字列が検索範囲にないときには-1が返される。

 以下に例を示す。

s = 'this is a sample string'

idx = s.find('is'# 'is'があるインデックスを取得(前方検索)
print(idx)  # 2('this'の'is'が該当)

idx = s.rfind('is'# 'is'があるインデックスを取得(後方検索)
print(idx)  # 5

idx = s.find('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(idx)  # 5

idx = s.find('foo'# 文字列が見つからなければ-1が返される
print(idx)  # -1


 この例では、'this is a sample string'という文字列から部分文字列'is'を検索している。最初のfindメソッド呼び出しでは、戻り値は「2」となっているが、これは'this'の'is'が検索により見つかっているからだ。このように単語としての'is'を検索するつもりなのに、違う部分で対象の部分文字列が見つかることがあるかもしれないので注意が必要だ(この場合なら、前後に空白文字を含めた' is 'を検索するなどの対策が考えられる)。

 次のrfindメソッド呼び出しは文字列の末尾から検索を行うので、単語の'is'があるインデックスである「5」が返されている。

 3つ目のfindメソッド呼び出しは、検索開始位置と検索終了位置を指定する例だ。既に述べたが、検索開始位置だけを指定することも可能だが、検索終了位置を指定するときには検索開始位置も指定する必要がある。これらを指定したときに実際に検索が行われる範囲は文字列のスライス「s[検索開始位置:検索終了位置]」となる。

 最後のfindメソッド呼び出しは、文字列中に存在しない部分文字列を検索した場合の例だ。このときには-1が返される。

 index/rindexメソッドはfind/rfindメソッドとほぼ同様に振る舞うが、部分文字列が存在しない場合に例外を発生する点だけが異なる。以下に例を示す。

s = 'this is a sample string'

idx = s.index('is'# 'is'があるインデックスを取得(前方検索)
print(idx)  # 2('this'の'is'が該当)

idx = s.rindex('is'# 'is'があるインデックスを取得(後方検索)
print(idx)  # 5

idx = s.index('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(idx)  # 5

idx = s.index('foo'# ValueError:文字列が見つからなければ例外が発生する


 最初の3つのindex/rindexメソッド呼び出しの結果はfind/rfindメソッドと同様である。最後のindexメソッド呼び出しでは、ValueError例外が発生している。

 検索したい文字列が存在しなかったときに、例外を発生させてそれを処理するのか、戻り値をチェックして何らかの処理を行うのかによってどちらのメソッドを使用するのかを選択することになるだろう。

文字列中に特定の部分文字列が何個含まれているかを調べる

 文字列中に特定の部分文字列が何個含まれているかを数えるには、countメソッドを使用する。以下に例を示す。

# 文字列中に特定の部分文字列が何個含まれているかを調べる
s = 'this is a sample string'
cnt = s.count('is'# 文字列sに'is'が何個含まれているか
print(cnt)  # 2

cnt = s.count('is', 3, len(s))  # 検索開始位置と終了位置を指定できる
print(cnt)  # 1


 ここでは文字列'this is a sample string'に部分文字列'is'が何個あるかを数えている。最初の呼び出しでは文字列全体から検索を行っているので、その結果は「2」だ。2つ目の例にあるように、countメソッドでも検索開始位置と検索終了位置を指定できる。この例では、検索開始位置に3、検索終了位置に文字列末尾(len(s))を指定しているので、その結果は「1」となる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。