2015/04/09

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

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 についてはこの他にも検索開始のインデックスを指定するような使い方もできるので、より詳しいところを知りたい方は次のページをご参照ください。

string.find - Python 公式ドキュメント

単純に部分文字列の有無だけをチェックしたい場合には in キーワードがより直感的で便利です。

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

正規表現を使うまでもないシンプルなケースではこの 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 などの関数を使えば「正規表現マッチオブジェクト」を生成して使うとよいでしょう。

import re

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

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

以上です。


参考
ライブラリ:re

1 件のコメント:

Frederick Guyton さんのコメント...
このコメントはブログの管理者によって削除されました。