[Python] 文字列検索 まとめ

Index

1. はじめに

Pythonの文字列の検索または、マッチするかを調べる方法をまとめる。
Pythonの文字列を調べる方法は、主に以下の3種類ある。

  • 演算子を用いる
  • 文字列のインスタンスを用いる
  • 正規表現のインスタンスを用いる

2. 演算子を用いる方法

演算子 説明
a == b a と b がメモリ上の同じアドレスならば True を、そうでなければ False を返す
a is b a と b が同じ文字列なら True を、そうでなければ False を返す
a in b b に a が含まれるのなら True を、そうでなければ False を返す
"abc" == "abc" # メモリ上の同じアドレスか
# True

"abc" is "abc" # 同じ文字列か
# True

"bc" in "abcd" # "abcd" に "bc" が含まれるか
# True

3. 文字列のメソッドを用いる方法

文字列を検索する文字列メソッドを示す。

文字列メソッド 説明
str.find(sub) sub が含まれる場合、その最小のインデックスを返す
sub が見つからなかった場合 -1 を返す
str.index(sub) find() と同様だが、部分文字列が見つからなかったとき ValueError を送出する
str.rfind(sub) sub が含まれる場合、その最大のインデックスを返す
sub が見つからなかった場合 -1 を返す
str.rindex(sub) rfind() と同様だが、部分文字列が見つからなかったとき ValueError を送出する
str.startswith(sub) 文字列が指定された sub で始まるなら True を、そうでなければ False を返す
sub は見つけたい複数の接頭語のタプルでも可
str.endswith(sub) sub で終わるなら True を、そうでなければ False を返す
sub は見つけたい複数の接尾語のタプルでも可
str.count(sub) sub が重複せず出現する回数を返す

また、すべてのメソッドは、第二引数と第三引数に整数を指定することによって、文字列のスライス str[第二引数:第三引数]の範囲で検索することができる。

s = """
Name: Elvis Presley
TEL: 090-1234-5678
Born: January 8, 1935
Described in Wikipedia: Elvis Aaron Presley[a] (January 8, 1935 – August 16, 1977) was an American singer and actor. Regarded as one of the most significant cultural icons of the 20th century, he is often referred to as the "King of Rock and Roll" or simply "the King".
"""

sub = 'Elvis'

s.find(sub)        # subが出現する最小のインデックスを返す
# 7

s.index(sub)       # subが出現する最小のインデックスを返す
# 7

s.rfind(sub)       # subが出現する最大のインデックスを返す
# 89

s.rindex(sub)      # subが出現する最大のインデックスを返す
# 89

s.startswith(sub)  # 文字列の始まりがsubか
# False

s.endswith(sub)   # 文字列が終わりがsubか
# False

s.count(sub)      # subが出現する数
# 2

4. 正規表現のメソッドを用いる方法

文字列を検索する正規表現メソッドを示す。

正規表現メソッド 説明
re.search(正規表現, 検索対象) 正規表現がマッチする最初の場所を探して、match オブジェクト を返す
マッチしない場合は、None を返す
re.match(正規表現, 検索対象) 文字列の先頭で正規表現にマッチすれば、match オブジェクトを返す
マッチしない場合は、None を返す
re.fullmatch(正規表現, 検索対象) 文字列全体が正規表現にマッチすれば、match オブジェクトを返す
マッチしない場合は、None を返す
re.findall(正規表現, 検索対象) 重複しないすべてのマッチを文字列のリストとして見つかった順で返す
マッチしない場合は、空のリストを返す
re.finditer(正規表現, 検索対象) findall()と同様だが、結果としてイテレータを返す
import re

s = """
Name: Elvis Presley
TEL: 090-1234-5678
Born: January 8, 1935
"""

pattern = '\d{4}' # 4桁の数値

re.search(pattern, s)    # 正規表現がマッチする最初を返す
# <_sre.SRE_Match object; span=(30, 34), match='1234'>

re.match(pattern, s)     # 正規表現が文字列の先頭にマッチするか
# None

re.fullmatch(pattern, s) # 文字列全体が正規表現にマッチするか
# None

re.findall(pattern, s)   # マッチするものをすべて返す
# ['1234', '5678', '1935', '1935']

re.finditer(pattern, s)  # マッチするものすべてをイテレータとして返す
# <callable_iterator object at 0x7fb85e6a1c88>

match オブジェクトの扱い

match オブジェクトは、以下のメソッドを持つ。

メソッド 説明
group() 正規表現にマッチした文字列を返す
start() マッチの開始位置を返す
end() マッチの終了位置を返す
span() マッチの位置 (start, end) を含むタプルを返す
import re

s = """
Name: Elvis Presley
TEL: 090-1234-5678
Born: January 8, 1935
"""

pattern = '\d{4}'
res = re.search(pattern, s)

res.group() # 正規表現にマッチした文字列を返す
# 1234

res.start() # マッチの開始位置を返す
# 30

res.end()  # マッチの終了位置を返す
# 34

res.span() # マッチの位置 (start, end) を含むタプルを返す
# (30, 34)

参考

書籍

入門 Python 3

入門 Python 3

Pythonスタートブック

Pythonスタートブック

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

  • 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/03/05
  • メディア: 大型本
  • 購入: 1人 クリック: 65回
  • この商品を含むブログ (30件) を見る

Pythonプロフェッショナルプログラミング 第2版

Pythonプロフェッショナルプログラミング 第2版