Pythonで文字列の一部を切り出したいとき、どのメソッドや構文を使えばよいか迷う方は多いです。スライスやsplit()、正規表現など複数のアプローチがあるため、目的に合った方法を選ばないと、コードが冗長になったり意図しない結果を招いたりする原因になります。
文字列の切り出しはデータ加工やログ解析など実務で頻繁に使う操作であり、正しい方法を把握しておくことによって開発効率が大きく向上します。特にPython初心者の場合、スライスのインデックス指定や負のインデックスの仕組みを正確に理解しておくことが欠かせません。
この記事では、Pythonの文字列を切り出す方法として、スライスによる位置指定や文字列メソッドによる抽出、正規表現によるパターンマッチの3つのアプローチを体系的に解説します。
目次
- Pythonのスライスで文字列を切り出す方法
- 先頭からN文字を切り出す
- 末尾からN文字を切り出す
- 開始位置と終了位置を指定して切り出す
- Pythonの文字列メソッドで文字列を抽出する方法
- find()で位置を検索して抽出する
- split()で区切り文字を基準に抽出する
- partition()で区切り文字の前後を抽出する
- Pythonの正規表現で文字列を抽出する方法
- re.search()で最初のマッチを抽出する
- re.findall()で全てのマッチを抽出する
- Pythonの文字列の切り出しに関するよくある質問
- スライスでインデックスが範囲外の場合エラーになりますか?
- 日本語(全角文字)を含む文字列の切り出しはズレませんか?
- スライスと正規表現はどちらを使うべきですか?
Pythonのスライスで文字列を切り出す方法
スライスとは、文字列やリストなどのシーケンス型に対して、インデックスの範囲を指定して部分要素を取り出すPythonの構文です。基本的な書き方は、以下の通りです。
文字列[start:end:step]
startは切り出しの開始位置、endは終了位置(この位置の文字は含まれない)、stepは取得する間隔を指定します。いずれも省略可能で、startを省略すると先頭から、endを省略すると末尾まで、stepを省略すると1文字ずつ取得されます。
スライスを使った文字列の切り出し方法として、以下の3つがあります。
- 先頭からN文字を切り出す
- 末尾からN文字を切り出す
- 開始位置と終了位置を指定して切り出す
それぞれインデックスの指定方法が異なり、正のインデックスと負のインデックスを使い分けることによって柔軟な切り出しが可能です。
それでは各方法について、詳しく解説していきます。
先頭から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文字の切り出しが完結します。
開始位置と終了位置を指定して切り出す
文字列の途中にある特定の範囲を切り出すには、startとendの両方を指定します。文字列[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には、文字列から特定の部分を抽出するための組み込みメソッドが複数用意されています。スライスでは対応しにくい「特定の文字を基準にした抽出」を行いたい場合に、以下の3つのメソッドが有効です。
- find()で位置を検索して抽出する
- split()で区切り文字を基準に抽出する
- 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つを使う場面が多いです。
- re.search()で最初のマッチを抽出する
- re.findall()で全てのマッチを抽出する
それぞれ用途が異なり、re.search()は最初に見つかった1件だけを取得する場合に、re.findall()は該当する全件をリストで取得する場合に適しています。
それでは各関数について、サンプルコード付きで解説していきます。
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やプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
