Python 逆引き集 | 文字列操作:部分文字列を取得する

Python Python
スポンサーリンク
スポンサーリンク

部分文字列を取得するとはどういうことか

Pythonで文字列を扱うとき、「先頭の何文字かだけ欲しい」「途中の一部だけ取り出したい」「拡張子だけ抜き出したい」といった場面が頻繁に出てきます。 こうした「文字列の一部を取り出したもの」が 部分文字列(サブ文字列、substring) です。

Pythonでは、主に

  • スライス構文 text[start:end]
  • 位置を調べてから切り出す(find() と組み合わせる)
  • 先頭・末尾を決め打ちで切り出す といった方法で部分文字列を取得します。 ここでは、初心者向けにステップバイステップで考えながら、例題とテンプレートを交えて丁寧に解説していきます。

スライス構文で部分文字列を取得する(基本中の基本)

スライスの基本形

text = "Pythonで文字列を操作します"

part = text[0:6]
print(part)  # Python
Python

text[start:end] は、

  • start から
  • end の「手前」まで の部分を取り出します。

ここで重要なのは、endは「含まれない」 という点です。 0:6 と書くと、インデックス 0〜5 の文字が取り出されます。

先頭から途中までを取り出す

text = "Pythonで文字列を操作します"

head = text[:6]
print(head)  # Python
Python

start を省略すると「先頭から」という意味になります。 text[:6] は「0から6の手前まで」、つまり先頭6文字です。

途中から末尾までを取り出す

text = "Pythonで文字列を操作します"

tail = text[6:]
print(tail)  # で文字列を操作します
Python

end を省略すると「末尾まで」という意味になります。 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
Python

text[:-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)  # 文字列
Python

find() で「どこにあるか」を調べてから、 その位置を使ってスライスすることで、 「特定の単語を正確に切り出す」 ことができます。

区切り文字で分割してから部分文字列を取得する

line = "name=Taro;age=20;city=Tokyo"

parts = line.split(";")
print(parts)  # ["name=Taro", "age=20", "city=Tokyo"]
Python

split() を使うと、 「区切り文字で分割された部分文字列のリスト」を得られます。

さらに、

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文字と分かっている場合
Python

2. ドメイン名を取得する

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

domain = url.split("/")[2]
print(domain)  # example.com
Python

split("/") で分割すると、

  • 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"
Python

Pythonのスライスは、 範囲外のインデックスを指定してもエラーにならず、 「存在する範囲だけ」を返します。

これは便利な反面、 「本当は間違った範囲を指定しているのに気づきにくい」 という問題にもつながります。

テストやレビューで、

  • 「どのインデックスからどのインデックスまでか」
  • 「意図した文字数になっているか」 を意識して確認することが大切です。

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]  # 拡張子を除いた部分
Python

find()+スライステンプレート

def extract_first(text, keyword):
    pos = text.find(keyword)
    if pos == -1:
        return None
    return text[pos:pos + len(keyword)]
Python

split() を使った部分文字列テンプレート

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での文字列操作が一段と力強いものになっていきます。

タイトルとURLをコピーしました