【Python】文字列の切り出しと抽出方法を解説

【Python】文字列の切り出しと抽出方法を解説

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

Python文字列の一部を切り出したいとき、どのメソッドや構文を使えばよいか迷う方は多いです。スライスsplit()正規表現など複数のアプローチがあるため、目的に合った方法を選ばないと、コードが冗長になったり意図しない結果を招いたりする原因になります。

文字列の切り出しはデータ加工やログ解析など実務で頻繁に使う操作であり、正しい方法を把握しておくことによって開発効率が大きく向上します。特にPython初心者の場合、スライスのインデックス指定や負のインデックスの仕組みを正確に理解しておくことが欠かせません。

この記事では、Pythonの文字列を切り出す方法として、スライスによる位置指定や文字列メソッドによる抽出、正規表現によるパターンマッチの3つのアプローチを体系的に解説します。



Pythonのスライスで文字列を切り出す方法

スライスとは、文字列やリストなどのシーケンスに対して、インデックスの範囲を指定して部分要素を取り出すPythonの構文です。基本的な書き方は、以下の通りです。

文字列[start:end:step]

startは切り出しの開始位置、endは終了位置(この位置の文字は含まれない)、stepは取得する間隔を指定します。いずれも省略可能で、startを省略すると先頭から、endを省略すると末尾まで、stepを省略すると1文字ずつ取得されます。

スライスを使った文字列の切り出し方法として、以下の3つがあります。

  1. 先頭からN文字を切り出す
  2. 末尾からN文字を切り出す
  3. 開始位置と終了位置を指定して切り出す

それぞれインデックスの指定方法が異なり、正のインデックスと負のインデックスを使い分けることによって柔軟な切り出しが可能です。

それでは各方法について、詳しく解説していきます。

先頭からN文字を切り出す

先頭からN文字を切り出すには、スライスのendにN(取得したい文字数)を指定します。startを省略すると自動的に0(先頭)が適用されるため、文字列[:N]の形式で記述できます。

text = "Python文字列切り出し"
result = text[:6]
print(result)

上記のコードを実行すると、Pythonと出力されます。インデックス0から5までの6文字が取得され、インデックス6の文字は含まれません。

Pythonのインデックスは0から始まるため、[:N]と指定するとインデックス0からN-1までの合計N文字が返されます。ファイル名の先頭部分やコードの接頭辞を取得する場面で活用できる方法です。

末尾からN文字を切り出す

末尾からN文字を切り出すには、startに負のインデックスを指定します。負のインデックスとは、文字列の末尾を-1として後ろから数える方式のことで、文字列[-N:]の形式で末尾のN文字を取得できます。

text = "Python文字列切り出し"
result = text[-5:]
print(result)

上記のコードを実行すると、列切り出しと出力されます。-5は末尾から5番目の位置を指し、そこから末尾までの5文字が取得される仕組みです。

末尾の固定長コード(例: 末尾4桁の年号や末尾N桁のチェックデジット)を取得する場合に活用できます。endを省略すると自動的に文字列の末尾まで取得されるため、[-N:]だけで末尾N文字の切り出しが完結します。

開始位置と終了位置を指定して切り出す

文字列の途中にある特定の範囲を切り出すには、startendの両方を指定します。文字列[start:end]と記述すると、インデックスstartからインデックスendの手前までの文字列が返されます。

text = "2026-04-22 東京都 晴れ"
result = text[11:14]
print(result)

上記のコードを実行すると、東京都と出力されます。インデックス11から13までの3文字が取得され、インデックス14の文字は含まれません。

Python公式ドキュメントでは、スライスのendは「取得範囲に含まれない最初の位置」と定義されています。この仕様により、stepを省略した通常のスライスでは、text[a:b]で取得される文字数はb - a個です。


Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

Pythonの文字列メソッドで文字列を抽出する方法

Pythonには、文字列から特定の部分を抽出するための組み込みメソッドが複数用意されています。スライスでは対応しにくい「特定の文字を基準にした抽出」を行いたい場合に、以下の3つのメソッドが有効です。

  1. find()で位置を検索して抽出する
  2. split()で区切り文字を基準に抽出する
  3. partition()で区切り文字の前後を抽出する

それぞれ抽出のアプローチが異なり、対象の文字列構造に応じて使い分けられます。find()は位置検索とスライスの組み合わせ、split()は区切り文字で分割、partition()は区切り文字の前後を一度に取得する方法です。

それでは各メソッドについて、サンプルコード付きで解説していきます。

find()で位置を検索して抽出する

find()メソッドは、文字列内で指定した部分文字列が最初に出現するインデックス(位置番号)を返すメソッドです。戻り値のインデックスをスライスと組み合わせることによって、特定の文字列を基準にした切り出しが可能です。

対象の文字列が見つからなかった場合、find()は-1を返します。類似メソッドのindex()は見つからない場合にValueErrorを発生させるため、エラーハンドリングの方針に応じて使い分けてください。

text = "name:Alice,age:30,city:Tokyo"

# "age:" の位置を検索して、その後ろの値を抽出する
start = text.find("age:")
if start != -1:
    start += len("age:")
    end = text.find(",", start)
    if end == -1:
        age = text[start:]
    else:
        age = text[start:end]
    print(age)  # 30

# 存在しないキーワードを検索した場合
result = text.find("email:")
print(result)  # -1

上記のコードでは、find()"age:"の開始位置を取得し、その直後から次のカンマまでをスライスで切り出しています。find()が-1を返すかどうかを事前にチェックすることによって、存在しない文字列を検索した場合の誤動作を防げます。

split()で区切り文字を基準に抽出する

split()メソッドは、指定した区切り文字(デリミタ)で文字列を分割し、リストとして返すメソッドです。デリミタとは、データの区切りを示す文字のことで、CSVのカンマやURLのスラッシュなどが該当します。

引数を省略した場合は空白文字(スペースやタブ、改行など)で分割されます。このとき、連続する空白文字は1つの区切りとして扱われ、結果のリストに空文字列が含まれない仕様です。

split(" ")のように区切り文字を明示した場合は連続空白がまとめられず空文字列が生成されるため、この違いに注意してください。

第2引数のmaxsplitに数値を指定すると、分割回数の上限を設定できるため、先頭の要素だけを取り出したい場合にも活用できます。

csv_line = "Alice,30,Tokyo,Engineer"

# カンマで分割してリストにする
parts = csv_line.split(",")
print(parts)       # ['Alice', '30', 'Tokyo', 'Engineer']
print(parts[0])    # Alice
print(parts[2])    # Tokyo

# maxsplitで分割回数を制限する
first, rest = csv_line.split(",", 1)
print(first)  # Alice
print(rest)   # 30,Tokyo,Engineer

# 空白文字で分割する(引数省略)
sentence = "Python is  a  powerful language"
words = sentence.split()
print(words)  # ['Python', 'is', 'a', 'powerful', 'language']

上記のコードでは、カンマ区切りの文字列をsplit(",")でリストに変換し、インデックス指定で各要素を取得しています。maxsplit=1を指定した場合は最初のカンマでのみ分割されるため、先頭の要素と残りの文字列を一度に取得できます。

partition()で区切り文字の前後を抽出する

partition()メソッドは、指定した区切り文字で文字列を3つのパート(区切り文字の前、区切り文字自体、区切り文字の後ろ)に分割するメソッドです。戻り値はタプルと呼ばれる変更不可のデータ型で、常に3つの要素を返します。

split()との違いは、区切り文字自体も戻り値に含まれる点と、最初に見つかった1箇所でのみ分割される点です。URLのプロトコル部分とドメイン部分を分けたい場合や、キーと値のペアを分離したい場合に適しています。

url = "https://example.com/path/to/page"

# "://" で分割してプロトコルとドメインを分離する
protocol, separator, rest = url.partition("://")
print(protocol)   # https
print(separator)  # ://
print(rest)       # example.com/path/to/page

# キーと値のペアを分離する
config = "database_host=192.168.1.100"
key, sep, value = config.partition("=")
print(key)    # database_host
print(value)  # 192.168.1.100

# 区切り文字が見つからない場合
text = "hello world"
before, sep, after = text.partition(":")
print(before)  # hello world
print(sep)     # (空文字)
print(after)   # (空文字)

上記のコードでは、partition()を使ってURLのプロトコル部分と残りの部分を分離しています。区切り文字が見つからない場合は、元の文字列が第1要素にそのまま格納され、第2要素と第3要素は空文字になるため、エラーが発生せず安全に処理を進められます。

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

Pythonで正規表現を使って文字列を抽出するには、標準ライブラリreモジュールをインポートします。正規表現とは、特定のパターンを定義して文字列の検索や抽出を行うための仕組みのことで、メールアドレスや電話番号のような複雑な形式の文字列を柔軟に取り出せます。

基本的な使い方として、スクリプトの先頭に以下の1行を記述します。

import re

reモジュールには複数の関数が用意されていますが、文字列の抽出では以下の2つを使う場面が多いです。

  1. re.search()で最初のマッチを抽出する
  2. re.findall()で全てのマッチを抽出する

それぞれ用途が異なり、re.search()は最初に見つかった1件だけを取得する場合に、re.findall()は該当する全件をリストで取得する場合に適しています。

それでは各関数について、サンプルコード付きで解説していきます。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

re.search()で最初のマッチを抽出する

re.search()は、文字列全体を走査して正規表現パターンに最初にマッチした部分を返す関数です。戻り値はマッチオブジェクトと呼ばれる特殊なオブジェクトで、マッチした文字列を取り出すにはgroup()メソッドを使用します。

以下のコードは、文字列の中から最初に見つかった数字の連続(3桁以上)を抽出する例です。

import re

text = "注文番号は12345、次の注文番号は67890です"
result = re.search(r"\d{3,}", text)

if result:
    print(result.group())  # 12345
else:
    print("マッチなし")

上記のコードでは、r"\d{3,}"というパターンで3桁以上の数字にマッチさせています。\dは任意の数字1文字を意味し、{3,}は3回以上の繰り返しを指定する量指定子です。

マッチしなかった場合、re.search()Noneを返すため、if result:のように結果を確認してからgroup()を呼び出す必要があります。Noneに対してgroup()を実行するとAttributeErrorが発生するため、必ずマッチの有無を判定してください。

Scan through string looking for the first location where the regular expression pattern produces a match, and return a corresponding match object. Return None if no position in the string matches the pattern.

出典:Python公式ドキュメント - re.search

re.findall()で全てのマッチを抽出する

re.findall()は、文字列全体からパターンにマッチした部分を全て探し出し、結果をリスト形式で返す関数です。re.search()が最初の1件だけを返すのに対し、re.findall()は該当する全件を一括で取得できます。

以下のコードは、文字列の中に含まれる全てのメールアドレス形式の文字列を抽出する例です。なお、このパターンは学習用の簡易版であり、RFC 5322に完全準拠したものではありません。

import re

text = "連絡先: user1@example.com と admin@test.org に送信してください"
results = re.findall(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", text)

print(results)  # ['user1@example.com', 'admin@test.org']

上記のコードでは、メールアドレスのパターンを正規表現で定義し、re.findall()で文字列内の全てのメールアドレスをリストとして取得しています。戻り値がリストのため、forで1件ずつ処理したり、len()でマッチ件数を確認したりできます。

マッチが1件もない場合は空のリスト[]が返されるため、re.search()のようにNoneチェックは不要です。ただし、正規表現パターン内にキャプチャグループ(丸括弧)を含めた場合、戻り値の形式が変わります。

グループが1個のときはそのグループ部分の文字列リスト、複数グループのときはタプルのリストが返される仕様です。意図しない結果を避けるには(?:...)の非キャプチャグループを使い分けてください。

Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result.

出典:Python公式ドキュメント - re.findall

Pythonの文字列の切り出しに関するよくある質問

スライスでインデックスが範囲外の場合エラーになりますか?

スライスで範囲外のインデックスを指定した場合、エラーは発生しません。Pythonのスライスは、指定された範囲が文字列の長さを超えていても、自動的に文字列の範囲内に調整されます。

ただし、スライスではなくインデックス指定(例: string[10])で範囲外にアクセスした場合はIndexErrorが発生します。スライス(string[0:100])とインデックス指定(string[100])では挙動が異なる点を意識しておくと、意図しないエラーを防げるでしょう。

日本語(全角文字)を含む文字列の切り出しはズレませんか?

Pythonのstr型はUnicodeコードポイント単位で文字を扱うため、通常の日本語(ひらがなやカタカナ、常用漢字)であればスライスやインデックス指定で意図通りに切り出せます。半角文字と全角文字が混在していても、通常のBMP文字は1コードポイント=1インデックスとして扱われます。

ただし、一部の絵文字やサロゲートペアを含む漢字(例: 𠮷)、結合文字(濁点が分離されたNFD形式)のように、見た目上の1文字が複数のコードポイントで構成される場合はスライスの結果が意図と異なる可能性があります。

スライスと正規表現はどちらを使うべきですか?

切り出す位置が固定されている場合は、スライスが第一候補です。スライスは記述が短く単純な処理で済むため、先頭からN文字や末尾からN文字を取得するような場面に適しています。

一方、メールアドレスや日付のように特定のパターンに一致する文字列を検索して抽出する場合は、正規表現が有効です。また、単純な区切り文字で分割するだけであればsplit()メソッドで対応できるため、正規表現を使わずに済むケースも多いでしょう。

※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。

ITやプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する