Python Tips: 文字列を検索したい

Python で文字列を検索する方法をご紹介してみます。

ここでは 2 つの方法をご紹介します。ひとつは「文字列型」のメソッドを使う最もシンプルな方法、もうひとつは「正規表現」を使う方法です。

  1. 文字列型のメソッドを使う方法
  2. 正規表現を使う方法

1. 文字列型のメソッドを使う方法

まずは文字列型のメソッドを使う方法を見てみましょう。

対象パターンの場所(インデックス)を取得したい場合には find() メソッドを、単純に対象パターンが存在するかどうかだけを知りたい場合には in キーワードを使います。

find() メソッドを使う

s = 'hello kyoto'
print(s.find('kyo'))    # => 6
print(s.find('tokyo'))  # => -1

文字列型のメソッド find() は、引数に渡されたパターンが最初に現れるインデックスを返します。マッチしなかった場合には -1 を返してくれます。

ちなみに、文字列の末尾の方から検索して一致箇所を探したい場合には rfind() メソッドを使うとよいでしょう。

s = "hello kyoto"
print(s.find('o'))   # => 4
print(s.rfind('o'))  # => 10

find() は第 2 引数、第 3 引数を指定することで検索範囲を絞り込むことができたりもするので、詳しい使い方に興味のある方は公式ページをご覧になってみてください。

一致箇所までは知る必要がなくて、単純に対象のパターンが存在するかどうかだけをチェックしたい場合には in キーワードを使うとよいでしょう。

print('hell' in 'hello kyoto')  # => True
print('heaven' in 'hello kyoto')  # => False

これは文章としてなんだか自然な感じで可読性も高いので、 in で事足りるケースではできるだけ in を使うのがよいでしょう。

正規表現を使う必要がないシンプルなケースではこの find()in を使うのがよいかと思います。

2. 正規表現を使う方法

もうひとつ、「正規表現」を使う方法を見てみましょう。

Python で正規表現を使うには標準ライブラリの re を使用します。マッチした文字列をそのまま取得したい場合は関数 findall() を使うとよいでしょう。

import re

print(re.findall('o.', 'hello world'))  # => ['o ', 'or']
print(re.findall('ohayo', 'hello world'))  # => []

マッチしたパターンが存在しない場合は空のリストが返ってきます。ちなみに、 findall() は結果をリストとして返しますが、 finditer() はリストではなくイテレータとして結果を返してくれます。

また、マッチした結果に対して何らかの処理や判定をしたい場合には、 search()match() などの関数が便利な「正規表現マッチオブジェクト」を返してくれるので、それらを使うようにするとよいでしょう。

import re

result = re.search('l+', 'hello world')
print(result.span())   # => (2, 4)
print(result.start())  # => 2
print(result.end())    # => 4

find()in を使った通常の文字列検索では物足りない場合には、こちらの正規表現を使うとよいかと思います。

以上です。

参考