↓もし、良かったらSNSでの紹介よろしくお願いします。

【Python】文字列を検索・抽出

bootstrap

本記事では、Pythonで文字列を検索するTipsを紹介します。
本記事では、文字列の抽出に焦点をあてています。

文字列が含まれているかの判定に興味がある場合は、下記の記事も参考になります。

https://www.tech-tech.xyz/string-in-python/

findメソッドが一般的

ある文字列から検索して探している文字が最初から数えて何番目かを取得したい場合は、
findメソッドを利用するのが一般的です。

>>>s = 'yamada taro'
>>>s.find('yamada')
0
>>>s.find('taro')
7
>>>s.find('hanako')
-1

findメソッドは、引数に渡された文字列が最初に現れる位置を返します。

位置の開始地点は0です。

検索した文字が含まれていないときは -1 を返します。

後ろから検索したい場合は、rfind

しかし、末尾から検索したい状況にもよく遭遇すると思います。

たとえば、ファイルパスからファイル名の部分を取得するとします。
このとき、”\”をfindメソッドで検索しても上手くいきません。
なぜなら、他のディレクトリの”\”にマッチしてしまうからです。

こういうときは、rfind() メソッドを使いましょう。

>>>filePath = r"C:\Users\taro\hoge.txt"
>>>filePath.rfind("\\")
13
>>>print(filePath[filePath.rfind("\\")+1:])
hoge.txt

範囲文字列検索

find,rfindメソッドは第2引数、第3引数を指定することで
検索範囲を絞り込むことができます。

>>>s = "My name is Taro."
>>>s.find("Taro", 5,15)
11
>>>s.find("Taro")#インデックスの開始位置は同じ
11
>>>s.find("Taro", 5,14)#範囲外だと
-1

大文字、小文字を区別せずに文字列検索

いままで、紹介したfind,rfindメソッドは、大文字、小文字を区別します。

しかし、大文字、小文字を区別せずに
文字列検索を行いたいときがあります。

このような場合、
すべて小文字か大文字かに揃えて検索を行うと良いです。

>>> s = "My name is Taro."
>>> s.find("taro")
-1
>>>s = "My name is Taro."
>>>w = "taro"
>>>s.find(w)#Taroとtaroがマッチしない
-1
>>>s.lower().find(w.lower())#小文字にそろえる
11
>>>s.upper().find(w.upper())#大文字にそろえる
11

文字列のパターン検索を行う(正規表現)

「4けたの数字」、「小文字のアルファベットの文字列」などパターンで
文字列検索を行いたいときがあります。

これらは、正規表現を用いると表現することができます。

これを正規表現であらわすと”\d\d\d\d”または、”\d{4}”となります。

また、アルファベットの文字列を正規表現であらわすと”[a-zA-Z]*”です。

Pythonで正規表現を使うには標準ライブラリreをimportします。

標準ライブラリなのでインストールは不要です。

正規表現で検索結果をすべて表示する

マッチした文字列を取得したい場合は`search`を使います。

>>>import re
>>>match = re.search('\d{4}-\d{2}-\d{2}', 'My birthday is 1990-11-12.')
>>>match.group(0)
'1990-11-12'

マッチした文字列をすべて取得したい場合は`findall`を使います。

>>>import re
>>>re.findall('\d{2}', 'My birthday is 1990-11-12.')
>>>['19','90','11','12']

正規表現で特定の箇所を抜き出す

正規表現で特定の箇所を抜き出す方法として`group`があります。

たとえば、生年月日の年を指定して抜き出す場合次のように書けます。

>>>import re
>>>match = re.search('(\d{4})-\d{2}-\d{2}', 'My birthday is 1990-11-12.')
>>>match.group(1)
'1990'