部分文字列を取得するとはどういうことか
Pythonで文字列を扱うとき、「先頭の何文字かだけ欲しい」「途中の一部だけ取り出したい」「拡張子だけ抜き出したい」といった場面が頻繁に出てきます。 こうした「文字列の一部を取り出したもの」が 部分文字列(サブ文字列、substring) です。
Pythonでは、主に
- スライス構文
text[start:end] - 位置を調べてから切り出す(
find()と組み合わせる) - 先頭・末尾を決め打ちで切り出す といった方法で部分文字列を取得します。 ここでは、初心者向けにステップバイステップで考えながら、例題とテンプレートを交えて丁寧に解説していきます。
スライス構文で部分文字列を取得する(基本中の基本)
スライスの基本形
text = "Pythonで文字列を操作します"
part = text[0:6]
print(part) # Python
Pythontext[start:end] は、
startからendの「手前」まで の部分を取り出します。
ここで重要なのは、endは「含まれない」 という点です。 0:6 と書くと、インデックス 0〜5 の文字が取り出されます。
先頭から途中までを取り出す
text = "Pythonで文字列を操作します"
head = text[:6]
print(head) # Python
Pythonstart を省略すると「先頭から」という意味になります。 text[:6] は「0から6の手前まで」、つまり先頭6文字です。
途中から末尾までを取り出す
text = "Pythonで文字列を操作します"
tail = text[6:]
print(tail) # で文字列を操作します
Pythonend を省略すると「末尾まで」という意味になります。 text[6:] は「インデックス6から最後まで」です。
深掘り:インデックスは0から始まる
Pythonでは、文字列のインデックスは 0から始まる というルールがあります。
text = "Python"
# P:0, y:1, t:2, h:3, o:4, n:5
Pythonこのルールを前提に、
- 「何文字目から何文字目まで」を
- 「どのインデックスからどのインデックスの手前まで」 に変換して考える癖をつけると、スライスがぐっと理解しやすくなります。
負のインデックスで「後ろから数える」
末尾から数える基本
text = "example.txt"
ext = text[-3:]
print(ext) # txt
Python-1 が「最後の文字」、-2 が「最後から2番目」というように、 負のインデックスは「後ろから数える」ために使います。
text[-3:] は「末尾から3文字分」を意味します。
末尾を除いた部分を取り出す
text = "example.txt"
name = text[:-4]
print(name) # example
Pythontext[:-4] は「末尾から4文字分を除いた残り」、つまり "example" になります。 ファイル名と拡張子を分けたいときなどに便利です。
深掘り:負のインデックスの感覚
text[-1]→ 最後の1文字text[-2]→ 最後から2番目text[-3:]→ 最後の3文字text[:-1]→ 最後の1文字を除いた部分
「後ろから数える」という感覚を持っておくと、 末尾側の部分文字列を扱うときに非常に楽になります。
位置を検索してから部分文字列を取得する
find() とスライスの組み合わせ
text = "Pythonで文字列を操作します"
pos = text.find("文字列")
if pos != -1:
part = text[pos:pos + len("文字列")]
print(part) # 文字列
Pythonfind() で「どこにあるか」を調べてから、 その位置を使ってスライスすることで、 「特定の単語を正確に切り出す」 ことができます。
区切り文字で分割してから部分文字列を取得する
line = "name=Taro;age=20;city=Tokyo"
parts = line.split(";")
print(parts) # ["name=Taro", "age=20", "city=Tokyo"]
Pythonsplit() を使うと、 「区切り文字で分割された部分文字列のリスト」を得られます。
さらに、
kv = parts[0].split("=")
key = kv[0] # "name"
value = kv[1] # "Taro"
Pythonのように、 「分割 → 部分文字列を取り出す」 という流れで、 設定文字列やクエリ文字列を解析できます。
深掘り:検索+スライスのメリット
- 「どこからどこまで」を柔軟に決められる
- 区切り文字やキーワードに基づいて部分文字列を抽出できる
- ログ解析や簡易パーサなどに応用しやすい
単純な位置指定だけでなく、 「まず検索してから切り出す」という発想を持っておくと、 文字列処理の幅が一気に広がります。
よくある用途別の部分文字列取得パターン
1. ファイル拡張子を取得する
filename = "report_2024.csv"
ext = filename.split(".")[-1]
print(ext) # csv
Pythonあるいは、負のインデックスを使っても書けます。
ext = filename[-3:] # 拡張子が3文字と分かっている場合
Python2. ドメイン名を取得する
url = "https://example.com/path/to/page"
domain = url.split("/")[2]
print(domain) # example.com
Pythonsplit("/") で分割すると、
- 0: “https:”
- 1: “”
- 2: “example.com” となるため、インデックス2がドメインになります。
3. 先頭の固定長コードを取得する
code = "ABC12345"
prefix = code[:3] # "ABC"
number = code[3:] # "12345"
Python商品コードやIDなど、 「先頭何文字かが意味を持つ」ケースでよく使われます。
セキュリティと品質の観点から見た「部分文字列」の注意点
1. インデックス指定のバグに注意する
text = "abc"
part = text[0:10] # エラーにはならないが、範囲外は無視される
print(part) # "abc"
PythonPythonのスライスは、 範囲外のインデックスを指定してもエラーにならず、 「存在する範囲だけ」を返します。
これは便利な反面、 「本当は間違った範囲を指定しているのに気づきにくい」 という問題にもつながります。
テストやレビューで、
- 「どのインデックスからどのインデックスまでか」
- 「意図した文字数になっているか」 を意識して確認することが大切です。
2. 入力が想定通りの形式でない場合の扱い
line = "name=Taro"
parts = line.split("=")
if len(parts) != 2:
print("形式が不正です")
else:
key, value = parts
Python分割やスライスは、 「入力が想定通りの形式である」ことを前提にしがちです。
しかし、外部からの入力は、
- 区切り文字が足りない
- 余計な文字が入っている
- そもそも形式が違う
といったことがよくあります。
そのため、 「分割後の要素数をチェックする」「find() の結果が -1 でないか確認する」 といった防御的な書き方が重要です。
3. 危険な部分文字列を見逃さない
query = "SELECT * FROM users; DROP TABLE users;"
if "DROP TABLE" in query:
print("危険なクエリです")
Python部分文字列の取得や検索は、
- 危険なキーワードの検出
- 不正な形式の検出 などにも使われます。
「どこからどこまでを切り出すか」を誤ると、 本来検出すべき危険な文字列を見逃す可能性があります。 そのため、 「検索範囲や切り出し範囲を正しく設計する」 ことがセキュリティの観点でも重要です。
部分文字列取得のテンプレートと練習用コード
基本スライステンプレート
text = "Pythonで文字列を操作します"
head = text[:6] # 先頭6文字
tail = text[6:] # 7文字目以降
middle = text[6:12] # 7〜12文字目(インデックス6〜11)
Python負のインデックステンプレート
filename = "example.txt"
ext = filename[-3:] # 拡張子
name = filename[:-4] # 拡張子を除いた部分
Pythonfind()+スライステンプレート
def extract_first(text, keyword):
pos = text.find(keyword)
if pos == -1:
return None
return text[pos:pos + len(keyword)]
Pythonsplit() を使った部分文字列テンプレート
def parse_kv(line):
parts = line.split("=")
if len(parts) != 2:
return None, None
return parts[0], parts[1]
Pythonまとめ
- 部分文字列の取得には、スライス構文
text[start:end]が基本であり、startとendの意味(endは含まれない)を理解することが重要です。 - 負のインデックスを使うことで、「末尾から数える」部分文字列取得が簡単になります。
find()やsplit()と組み合わせることで、区切り文字やキーワードに基づいた柔軟な部分文字列抽出が可能になります。- インデックス指定や入力形式の前提を誤ると、バグやセキュリティ上の問題につながるため、防御的なチェックをセットで考えることが大切です。
部分文字列の取得は、文字列処理の中でも特に頻度が高く、 ログ解析・設定ファイルの読み取り・URLやパスの分解・危険な文字列の検出など、 多くの実務的な場面で役立つ技術です。 ここを丁寧に押さえておくことで、Pythonでの文字列操作が一段と力強いものになっていきます。

