Pythonで文字列を検索する方法を紹介します。
文字列を検索するといっても、部分一致・全文一致・前方一致・後方一致などやりたいことは様々あります。
またアプローチの方法も多くありますでの、
この記事でPythonでよく使用する文字列検索をマスターするために役立ててください。
find():文字列の開始位置を取得
数値型データや配列型を文字列にするには「find()」メソッドを使用します。
<文字列オブジェクト>.find(<検索する文字列>)
引数に渡された検索する文字列の最初に現れる開始位置が返されます。
仮にマッチされない場合には「-1」が返されます。
以下が使用方法になります。
>>> string = 'Hello World.'
>>> string.find('World')
6
>>> string.find('world')
-1
なお「rfind()」という類似のメソッドもあります。
「rfind()」は文字列の末尾から検索します。
>>> string = 'Hello World.'
>>> string.find('o')
4
>>> string.rfind('o')
7
in:文字列の存在有無を確認
文字列の存在有無を確認するだけならば「in」を使用することもできます。
<検索する文字列> in <検索対象の文字列>
検索文字列がマッチする場合は「True」、検索文字列がマッチしない場合は「Flase」が返ります。
以下が使用方法になります。
>>> string = 'Hello World.'
>>> print('World' in string)
True
>>> print('world' in string)
False
re.search()とre.match():正規表現で検索
正規表現で文字列を検索する場合「search()」、「match()」を使用します。
import re
# 全文からから検索
re.search(<検索する文字列>, <検索対象の文字列>)
# 文字列の先頭から検索
re.match(<検索する文字列>, <検索対象の文字列>)
「search()」は全文中から検索することができますが、
「match()」は文字列の先頭からのみ検索します。
以下が使用方法になります。
>>> import re
>>> string = '123-4567 Hello World.'
>>> re.search('[0-9]{3}-[0-9]{4}', string)
<_sre.SRE_Match object; span=(0, 8), match='123-4567'>
>>> string = 'Hello World. 123-4567'
>>> re.search('[0-9]{3}-[0-9]{4}', string)
<_sre.SRE_Match object; span=(13, 21), match='123-4567'>
>>>
>>> string = '123-4567 Hello World.'
>>> re.match('[0-9]{3}-[0-9]{4}', string)
<_sre.SRE_Match object; span=(0, 8), match='123-4567'>
>>> # マッチできない
... string = 'Hello World. 123-4567'
>>> re.match('[0-9]{3}-[0-9]{4}', string)
>>>
re.findall():複数検索結果がある場合の検索
複数の検索結果がある場合「findall()」関数を使用します。
import re
re.findall(<検索する文字列>, <検索対象の文字列>)
検索にマッチした文字列はリスト型で返却されます。
「findall()」は「re」ライブラリであることに注意してください。
以下が使用方法になります。
>>> import re
>>> string = '1234 5678 1234 5678'
>>> re.findall('1234', string)
['1234', '1234']
re.finditer():検索結果をイテレーターで返す
検索結果をイテレーターで返す場合は「finditer()」関数を使用します。
import re
re.finditer(<検索する文字列>, <検索対象の文字列>)
検索にマッチしたすべて文字列はイテレーターで返却されます。
「finditer()」は「re」ライブラリであることに注意してください。
>>> string = 'Hello World. Hello World.'
>>> re.finditer('Hello', string)
<callable_iterator object at 0x000001CC0C80B208>
>>> for value in re.finditer('Hello', string):
... print(value)
...
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
<_sre.SRE_Match object; span=(13, 18), match='Hello'>
startswith():前方一致で検索文字列が含まれているか確認
前方一致で検索文字列が含まれているか確認するのは「starswith()」メソッドを使用します。
<文字列オブジェクト>.startswith(<前方一致で検索する文字列>)
検索文字列がマッチする場合「True」、検索文字列がマッチしない場合「False」です。
以下が使用方法になります。
>>> string = 'Hello World.'
>>> string.startswith('Hello')
True
>>> string.startswith('World.')
False
endswith():後方一致で検索文字列が含まれているか確認
後方一致で検索文字列が含まれているか確認するのは「endswith()」メソッドを使用します。
<文字列オブジェクト>.endswith(<前方一致で検索する文字列>)
検索文字列がマッチする場合「True」、検索文字列がマッチしない場合「False」です。
以下が使用方法になります。
>>> string = 'Hello World.'
>>> string.endswith('World.')
True
>>> string.endswith('Hello')
False