Python

Pythonで文字列を指定して抽出する方法

By 2021年3月28日No Comments

Pythonで文字列を抽出するには文字列のインデックスを指定する方法とスライスで文字列の範囲を指定する方法があります。

さらに正規表現であるmatch( )関数やsearch( )関数、findall( )関数などを使って一致する全ての文字列を抽出することができます。

指定した位置の文字列を一文字を抜き出すことをインデックス指定といいます。指定した範囲の文字列を抜き出すことをスライスといいます。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト

Pythonでインデックス指定して文字列を抽出する方法

Pythonの文字列の抽出するには文字列のインデックス番号を指定します。文字列にはそれぞれの文字にインデックス番号が割り振られています。

hello = 'みなさんこんにちわ'print(hello)

結果:

みなさんこんにちわ。

この文字列のインデックス番号は下記になります。

0   1   2    3   4   5   6    7    8

み な さ  ん  こ  ん に  ち   わ

-9  -8  -7  -6  -5  -4  -3  -2   -1

インデックス番号は左から数える場合は0から、右から数える場合は-1から始まります。このインデックス番号を指定して文字列を抽出することができます。構文は下記になります。

文字列[インデックス番号]

左から数えたインデックス番号で抽出します。

print(hello[6])

結果:

このようにインデックス番号を指定すると対象の文字列を抽出することができます。

Pythonでスライスを使って文字列を指定して抜き出す方法

文字列のインデックス番号の範囲を指定してスライスすると文字列の中の文字を取り出すことができます。構文は下記になります。

文字列[開始位置:終了位置:ステップ]

文字列のインデックス位置0から2の要素の範囲を抽出します。

hello = 'みなさんこんにちわ'print(hello[0:2])

結果:

みな

指定した範囲の文字を抜き出しました。ただし終了位置に指定した値の要素については取得されません。

インデックス番号の開始位置だけを指定するとそこから最後まで抽出することができます。

print(hello[5:])

結果:

んにちわ

終了位置だけを指定する事もできます。

print(hello[:5])

結果:

みなさんこ

ステップに何文字置きで抽出したいかを指定することもできます。

print(hello[::3])

結果:

みんに

3文字間隔で文字列を抽出しました。開始位置と終了位置とステップをすべて指定します。

print(hello[2:8:2])

結果:

さこに

このようにスライスすることで文字列の範囲を指定して様々なパターンで文字を抜き出すことができました。

pythonで右から何文字かをスライスして文字を抽出する方法

文字列の右から数えたインデックス番号を指定したい場合は「-」から始まるインデックス番号を指定することで取得することができます。

hello = 'みなさんこんにちわ'print(hello[-5])

結果:

右から5文字目の文字列を取得することができました。右からインデックス番号を数える場合は「-1」から始まります。

右から文字列を指定してスライスする場合も同じようにできます。

print(hello[-5:-1])

結果:

こんにち

このように文字列の右側から文字列を指定する場合は「-」から値を数えます。

Pythonの正規表現を使って文字列を抽出する方法

正規表現を使うことで複雑な文字列の抽出をすることができます。正規表現を扱う関数を使うにはreモジュールをインポートします。

import re

match( )関数は対象となる文字列の先頭に任意の文字列と一致するものが存在するかどうかを判定する関数です。文字列の最初の部分で文字列が一致した最初の要素を返すことができます。構文は下記になります。

re.match(正規表現のパターン, 対象の文字列)

第一引数に抽出したい文字列を正規表現パターンで入力します。[あ-ん]と正規表現のパターンを書くと、ひらがなの文字列の全てを対象とすることができます。

hello = "みなさんこんにちわ"hello_r = re.match(r"[あ-ん]{9}", hello)print (hello_r)

結果:

<re.Match object; span=(0, 9), match='みなさんこんにちわ'>

このような形式の戻り値をマッチオブジェクトとよばれます。マッチオブジェクトでは見たい対象ごとに抽出することもできます。文字列の中身をだけ表示したいときはgroup( )を使用します。

hello = 'みなさんこんにちわ'match = re.match(r"[あ-ん]{9}", hello)print(match.group())

結果

みなさんこんにちわ

このように文字列だけを取得することができました。Pythonで文字列の処理をする時に特定の文字列を検索したいというような場合に文字列を検索するためにmatch( )関数を使います。

search( )関数は文字列全体の中で最初に条件に一致した文字列を抽出します。match( )関数は対象の文字列の先頭に文字列がないといけませんが、search( )関数は対象の文字列全体の中から抽出してくれます。構文は下記になります。

re.search(正規表現のパターン, 対象の文字列)

hello = "123みなさんこんにちわ"hello_r = re.search(r"[あ-ん]{9}", hello)print(hello_r)

結果:

<re.Match object; span=(3, 12), match='みなさんこんにちわ'>

このように条件に一致する文字列を取得することができました。

findall( )関数は、対象の文字列全体の中から正規表現で指定したパターンに一致する全ての文字列をリスト形式で抽出することができます。構文は下記になります。

re.findall(正規表現のパターン, 対象の文字列)

hello = "みなさんこんにちわ, みなさんこんばんわ"hello_list = re.findall(r"[あ-ん]{9}", hello)print(hello_list)

結果:

[‘みなさんこんにちわ’, ‘みなさんこんばんわ’]

条件と一致する文字列がリスト形式で出力されました。

正規表現にはエスケープで始まる特殊なメタ文字であるエスケープシーケンスがあります。エスケープというのは「\」 をつけて特殊な動作を無効にさせることができます。

エスケープシーケンス意味
\a端末ベル文字
\cXCtrl + X
\n改行コード ASCII行送り(LF)
\r改行コード ASCII復帰(CR)
\fフォームフィード(FF)改ページ
\Rすべての改行コード(「\n\r\n\r」)
\t水平タブ (TAB)
\vASCII 垂直タブ (VT)
\s空白文字(半角スペース、\t、\n、\r、\f)
\S空白文字以外のすべての文字
\d数字。[0-9]
\D数字以外の文字列。[^0-9]
\w半角英数字とアンダースコアのうち任意の一文字。[a-zA-Z0-9_]
\W半角英数字とアンダースコア以外の1文字[^a-zA-Z0-9_]
\l半角英小文字のうち1文字
\L半角英小文字の以外の文字1文字(=英大文字、数字、全角文字)
\u半角英大文字のうち1文字
\U半角英大文字以外の1文字(=英小文字、数字、全角文字)
\0NULL文字(
\newline文字列を途中で改行する
\\バックスラッシュ (\)
\’一重引用符 (‘)
\”二重引用符 (“)
\bASCII バックスペース (BS)
\ooo8進数oooを持つASCII文字
\xhh16進数hhを持つASCII文字
\N{name}Unicode データベース中で名前 name を持つ文字
\uxxxx16ビットの16進数値xxxxを持つUnicode文字
\Uxxxxxxxx32ビットの16進数値xxxxxxxxを持つUnicode文字

このようなエスケープシーケンスを使うとより短縮して記述することができます。

まとめ

今回はPythonで文字列を抽出するのに必要な文字列のインデックス指定やスライスで文字列の抽出する範囲を指定する方法や、さらに正規表現を使った文字列の抽出をしました。以上、Pythonで文字列の抽出をする方法についてでした。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL