文字列 文法・環境

【Python】文字列を検索・抽出する方法【in演算子、findメソッド、正規表現】

Pythonにおいて、文字列を検索・抽出する方法について、紹介します。

本記事では、以下の内容を紹介しています。

この記事で分かること

  • 文字列を部分的に抽出する方法【スライス】
  • 特定の文字列を検索・抽出する方法【in演算子、findメソッド】
  • 正規表現を用いて、文字列を検索・抽出する方法

スポンサーリンク

文字列を部分的に抽出【スライス】

はじめに、文字列を部分的に抽出する方法について紹介します。

文字列の基本的な抽出方法として、以下の2つの方法を紹介します。

  • インデックスを指定して、文字を抽出
  • スライスを使用して、文字列を部分的に抽出

インデックスで文字列を抽出

インデックス指定で、文字列から文字を抽出する方法を紹介します。

[ ]に、インデックスを指定することで、対応する位置の文字を抽出できます。

以下、サンプルコードです。

# インデックスで文字を抽出
s = 'tokyo osaka kyoto nara hokkaido'

print(s[2])
# k

スライスで文字列を抽出

スライスで文字列を部分的に抽出する方法を紹介します。

開始インデックスと、終了インデックスを指定すると、文字列を部分的に抽出できます。

以下、サンプルコードです。

# スライスで文字列を抽出
s = 'tokyo osaka kyoto nara hokkaido'

print(s[0:5])
# tokyo

print(s[6:11])
# osaka

文字列におけるスライスの使用方法については、下記の記事で紹介しています。

スライスを用いて文字列の一部を取得する方法

スポンサーリンク

特定の文字列を検索・抽出【in演算子、findメソッド】

特定の文字を検索・抽出する方法について紹介します。

特定の文字列を抽出する方法として、以下の3つを紹介します。

  • 特定の文字列が含まれるか検索【in演算子】
  • 特定の文字列のインデックスを取得【findメソッド】
  • 特定の文字の後ろを抽出【findメソッド、スライス】
  • 特定の文字の前を抽出【findメソッド、スライス】

特定の文字列が含まれるか検索

特定の文字列が含まれるか検索する方法について紹介します。

「in演算子」を使用することで、文字列の中に特定の文字が含まれるか判定することができます。

特定の文字が含まれる場合はTrue、含まれない場合はFalseが返されます。

以下、サンプルコードです。

# 特定の文字が含まれるか検索
s = 'tokyo osaka kyoto nara hokkaido'

print('p' in s)
# False

print('k' in s)
# True

print('nagoya' in s)
# False

print('kyoto' in s)
# True

特定の文字列のインデックスを取得

文字列の「findメソッド」を使用することで、特定の文字のインデックスを取得できます。

特定の文字が含まれる場合は対応するインデックスが返され、含まれない場合は-1が返されます。

また、同じ文字が複数ある場合は、前にある文字のインデックスが返されます。

以下、サンプルコードです。

# 特定の文字のインデックスを取得
s = 'tokyo osaka kyoto nara hokkaido'

print(s.find('p'))
# -1

print(s.find('k'))
# 2

print(s.find('nagoya'))
# -1

print(s.find('kyoto'))
# 12

特定の文字より後ろを抽出

特定の文字より後ろにある文字列を抽出する方法を紹介します。

文字列のfindメソッドと、スライスを組み合わせることで、特定の文字より後ろにある文字列を抽出できます。

以下、サンプルコードです。

# 特定の文字より後ろを抽出
s = 'tokyo osaka kyoto nara hokkaido'


idx = s.find('p')
print(idx)
# -1
print(s[idx + 1:])
# tokyo osaka kyoto nara hokkaido


idx = s.find('k')
print(idx)
# 2
print(s[idx + 1:])
# yo osaka kyoto nara hokkaido


idx = s.find('nagoya')
print(idx)
# -1
print(s[idx + 1:])
# tokyo osaka kyoto nara hokkaido


idx = s.find('kyoto')
print(idx)
# 12
print(s[idx + 1:])
# yoto nara hokkaido

最後の例のように、 idx = s.find('kyoto') とした場合は、先頭の"k"の文字のインデックスが抽出されます。
そのため、"kyoto"の"k"以降の文字列についても、抽出結果に含まれてしまうことになります。

検索に使用した、"kyoto"の文字列を含みたくない場合は、文字列の長さを取得できるlen関数と組合せます。

以下、サンプルコードです。

# 特定の文字より後ろを抽出
s = 'tokyo osaka kyoto nara hokkaido'


search = 'kyoto'

idx = s.find(search)
print(idx)
# 12
print(s[idx + len(search) + 1:])
# nara hokkaido

特定の文字より前を抽出

特定の文字より前にある文字列を抽出する方法を紹介します。

特定の文字より前にある文字列を抽出する場合についても、文字列のfindメソッドと、スライスを組み合わせることで抽出できます。

以下、サンプルコードです。

# 特定の文字より前を抽出
s = 'tokyo osaka kyoto nara hokkaido'


idx = s.find('p')
print(idx)
# -1
print(s[:idx])
# tokyo osaka kyoto nara hokkaid


idx = s.find('k')
print(idx)
# 2
print(s[:idx])
# to


idx = s.find('nagoya')
print(idx)
# -1
print(s[:idx])
# tokyo osaka kyoto nara hokkaido


idx = s.find('kyoto')
print(idx)
# 12
print(s[:idx])
# tokyo osaka 

スポンサーリンク

正規表現を用いて、文字列を検索・抽出する方法

正規表現を用いて、文字列を検索・抽出する方法を紹介します。

正規表現パターンに一致する文字列を抽出できます。

以下、文字列から電話番号を抽出するサンプルコードです。

import re

s = 'ページ番号:123  更新日:2022/11/2' + '\n' + \
    '<○○区役所庁舎案内>' + '\n' + \
    '電話:03-1234-5566(代表)'+ '\n' + \
    '特設サイト:https://www.city.xxx.tokyo.jp/toiawase/'

pattern = r'[(]?\d{2,4}[-)]?\d{2,4}-\d{3,4}'
res = re.findall(pattern, s)

print(res)
# ['03-1234-5566']

Pythonの正規表現については、以下の記事で詳しく紹介しているので併せて参考にしてみてください。

【Python】正規表現の基本的な使用方法【reモジュール】
【Python】正規表現の具体的な使用例【日付、電話番号、メールアドレス、URL】

【補足】特定の文字列を検索し、位置を取得【正規表現】

正規表現を用いて、特定の文字列を検索し、位置を取得する方法を紹介します。

reモジュールのfinditer( )関数を用いることで、マッチした文字列と位置の情報をイテレータで取得することができます。

イテレータの中身は、forループでまわすことで、1つずつ確認できます。

以下、サンプルコードです。

s = 'Aさんの電話番号 : 03-1234-5678' + '\n' + \
    'Bさんの電話番号 : 090-1234-5678' + '\n' + \
    'Cさんの電話番号 : 0120-12-3456' + '\n' + \
    'Dさんの電話番号 : 0120-123-456' + '\n' + \
    'Eさんの電話番号 : (03)1234-5678' + '\n' + \
    '数値 : 1234567891'

pattern = r'[(]?\d{2,4}[-)]?\d{2,4}-\d{3,4}'
res = re.finditer(pattern, s)

for r in res :
    print(r)
# <re.Match object; span=(11, 23), match='03-1234-5678'>
# <re.Match object; span=(35, 48), match='090-1234-5678'>
# <re.Match object; span=(60, 72), match='0120-12-3456'>
# <re.Match object; span=(84, 96), match='0120-123-456'>
# <re.Match object; span=(108, 121), match='(03)1234-5678'>

マッチオブジェクトとして、マッチした文字列と、文字列の開始位置・終了位置が取得できています。

【補足】特定の文字に囲まれた文字列を検索【正規表現】

正規表現を用いて、特定の文字に囲まれた文字列を検索する方法を紹介します。

以下、 < > に囲まれた文字列を検索するサンプルコードです。

import re

s = 'ページ番号:123  更新日:2022/11/2' + '\n' + \
    '<○○区役所庁舎案内>' + '\n' + \
    '電話:03-1234-5566(代表)'+ '\n' + \
    '特設サイト:https://www.city.xxx.tokyo.jp/toiawase/'

pattern = r'<.*?>'
res = re.finditer(pattern, s)

for r in res :
    print(r)
# <re.Match object; span=(25, 36), match='<○○区役所庁舎案内>'>

正規表現パターン <.*?> は、非貪欲マッチにしています。

正規表現の非貪欲マッチについては、下記の記事で紹介しています。

【Python】正規表現の貪欲・非貪欲マッチ

スポンサーリンク

-文字列, 文法・環境
-,