【Python】文字列メソッドの使い方|split・join・replace・strip・find

【Python】文字列メソッドの使い方|split・join・replace・strip・find Python

文字列の分割・連結・置換・空白の除去などは、Pythonでデータを扱うときの基本操作です。これらは文字列が持つメソッド"文字列".split()のように書く関数)で行います。CSVの行を分割したり、入力の前後の空白を取り除いたり、文字を置き換えたりと、出番の多い操作です。

覚えておきたいのは、文字列は変更できない(イミュータブル)という性質です。replace()などは元の文字列を書き換えるのではなく、処理後の新しい文字列を返すため、結果は変数で受け取る必要があります。この記事では、実機のPythonで確認しながら、よく使う文字列メソッドを整理します。

先に結論

  • split()で分割、"区切り".join(リスト)で連結します。
  • replace(古い, 新しい)で置換。元の文字列は変わらず、新しい文字列が返ります
  • strip()で前後の空白・改行を除去します(lstrip()/rstrip()で片側だけ)。
  • upper()/lower()で大文字・小文字に変換します。
  • 検索はfind()(無ければ-1)、index()(無ければエラー)、含むかはinです。
  • "7".zfill(3)"007"のようにゼロ埋めできます。

文字列の組み立てはf-stringと文字列フォーマットsplit()が返すのはリスト(list)、一括変換には内包表記もあわせて参考になります。

スポンサーリンク

分割する split

split()は文字列を区切りで分割し、リストを返します。引数を省略すると空白(スペース・タブ・改行)で分割し、区切り文字を指定すればその文字で分割します。

split.py
# 引数なし → 空白で分割(連続する空白はまとめて1つ・空要素は残らない)
print("a  b   c".split())     # ['a', 'b', 'c']

# 区切り文字を指定 → その文字で分割(空要素も残る)
print("a,b,,c".split(","))    # ['a', 'b', '', 'c']

# 分割回数を制限(maxsplit)
print("a-b-c".split("-", 1))  # ['a', 'b-c']

# 改行で分割するなら splitlines も便利
print("1行目\n2行目".splitlines())   # ['1行目', '2行目']
split()とsplit(” “)は動きが違う

実機で確認したところ、引数なしのsplit()は連続する空白をまとめて扱い、"a b c"(空白が複数)でも['a', 'b', 'c']ときれいに分割し、空の要素を残しません。一方、区切りを指定したsplit(",")"a,b,,c"['a', 'b', '', 'c']と分割し、連続する区切りの間に空文字が残ります。スペース区切りのデータをきれいに分割したいときは、引数なしのsplit()が便利です。

連結する join

リストを1つの文字列にまとめるにはjoin()を使います。「区切り文字」のメソッドとして呼ぶ点が独特で、"区切り".join(リスト)と書きます。

join.py
parts = ["2026", "06", "23"]

print("-".join(parts))   # 2026-06-23
print("/".join(parts))   # 2026/06/23
print("".join(parts))    # 20260623(区切りなしで連結)

# split と join は逆の操作
csv = "a,b,c"
items = csv.split(",")        # ['a', 'b', 'c']
print(" | ".join(items))      # a | b | c
joinの対象は文字列のリストにする

join()でまとめられるのは文字列の要素だけです。"-".join([2026, 6, 23])のように数値が混ざっているとTypeErrorになります。数値のリストを連結したいときは、"-".join(str(n) for n in numbers)のように、先にstr()で文字列へ変換してください。split()join()は「分割」と「連結」で逆の関係になっており、セットで覚えると便利です。

置換する replace(と immutable)

replace(古い文字列, 新しい文字列)で文字を置き換えます。標準では見つかったものをすべて置換します。ここで大切なのが、文字列は変更できないという点です。

replace.py
s = "a.b.c"

print(s.replace(".", "/"))     # a/b/c(すべて置換)
print(s.replace(".", "/", 1))  # a/b.c(回数を指定)

# 文字列はイミュータブル → 元の s は変わらない
print(s)                       # a.b.c(そのまま)

# 結果を使いたいなら変数で受け取る
s = s.replace(".", "/")
print(s)                       # a/b/c

実機でも、s.replace(".", "/")を呼んだあとも元のsa.b.cのままでした。replace()は元の文字列を書き換えず、置換後の新しい文字列を返すためです。結果を残したいときはs = s.replace(...)のように変数へ代入し直します。これはstrip()upper()など、ほかの文字列メソッドにも共通する考え方です。第3引数で置換する回数を指定することもできます。

前後の空白を取り除く strip

入力データの前後についた空白や改行を取り除くにはstrip()を使います。フォーム入力やファイルから読んだ行の整形でよく使います。

strip.py
print("  hi  ".strip())     # 'hi'(前後の空白を除去)
print("hi\n".rstrip())      # 'hi'(右側=末尾の改行を除去)
print("  hi".lstrip())      # 'hi'(左側=先頭の空白を除去)

# 取り除く文字を指定することもできる
print("xxhixx".strip("x"))  # 'hi'
print("https://example.com/".rstrip("/"))   # 'https://example.com'

実機でも、" hi ".strip()'hi'"hi\n".rstrip()'hi'になりました。strip()は前後両方、lstrip()は先頭側、rstrip()は末尾側だけを処理します。引数に文字を渡すと、空白の代わりにその文字を取り除けます(末尾のスラッシュを消す、などに便利です)。ファイルを1行ずつ読むと末尾に改行が付くため、rstrip()での除去が定番です。

大文字・小文字を変換する

大文字・小文字の変換にはupper()lower()を使います。比較の前に大小をそろえる(大文字小文字を区別しない検索)などに使います。

case.py
print("Hello".upper())        # HELLO
print("Hello".lower())        # hello
print("hello world".title())  # Hello World(各単語の先頭を大文字)
print("Hello".capitalize())   # Hello(文の先頭だけ大文字)

# 大文字小文字を区別せずに比較する
a = "Python"
b = "python"
print(a.lower() == b.lower())   # True

実機でも、"Hello".upper()HELLO"hello world".title()は各単語の先頭を大文字にしたHello Worldになりました。検索や比較で「大文字small文字を区別したくない」ときは、両方をlower()でそろえてから比較すると確実です。

検索する find・index・in

文字列の中に特定の文字があるかを調べる方法は3つあります。位置がほしいならfind()index()、含むかどうかだけならinです。find()index()は、見つからなかったときの動きが違うので注意します。

find.py
s = "abcabc"

# find: 位置(最初に見つかった場所)。無ければ -1
print(s.find("b"))    # 1
print(s.find("z"))    # -1(見つからない)

# index: 位置を返すが、無いとエラー(ValueError)
print(s.index("b"))   # 1
# s.index("z")        # ValueError: substring not found

# in: 含むかどうかを True / False で
print("b" in s)       # True
print("z" in s)       # False

# 出現回数を数える
print(s.count("a"))   # 2
findは-1、indexはエラー

実機で確認したところ、"abcabc".find("z")-1を返し、index("z")ValueErrorになりました。見つからない可能性があるならfind()を使い、戻り値が-1かどうかで判定すると安全です。なおfind()の戻り値をif s.find("z"):のように真偽値として使うのは危険です。位置が0(先頭で見つかった)のときにFalse扱いになってしまうため、if s.find("z") != -1:と明示的に比較してください。単に含むかどうかを知りたいだけならinがもっとも簡単です。

先頭・末尾を調べる startswith / endswith

「特定の文字で始まる/終わる」を調べるにはstartswith()endswith()を使います。拡張子やURLの判定などに便利です。

startswith.py
print("file.txt".endswith(".txt"))      # True
print("https://x.com".startswith("https"))   # True

# 複数の候補はタプルで渡せる
name = "photo.png"
print(name.endswith((".png", ".jpg", ".gif")))   # True

実機でも、"file.txt".endswith(".txt")Trueになりました。複数の候補を調べたいときは、endswith((".png", ".jpg"))のようにタプルで渡すと、どれかに当てはまればTrueになります。画像ファイルかどうかの判定などに使えます。

数値のゼロ埋め zfill

連番やIDを001のように桁をそろえたいときはzfill()を使います。指定した桁数になるよう先頭を0で埋めます。

zfill.py
print("7".zfill(3))     # 007
print("42".zfill(5))    # 00042

# 数値は str にしてから
n = 7
print(str(n).zfill(3))  # 007

# rjust でも同じことができる(埋める文字を指定)
print("7".rjust(3, "0"))   # 007

実機でも、"7".zfill(3)007になりました。数値をゼロ埋めしたいときは、str()で文字列にしてからzfill()を呼びます。同じことはrjust(3, "0")でもでき、こちらは埋める文字を自由に指定できます。ファイル名の連番(img007.pngなど)をそろえるのに便利です。

よく使う文字列メソッド一覧

この記事で扱った主なメソッドをまとめます。

メソッド 働き
split(区切り) 分割してリストにする
"区切り".join(リスト) リストを連結して文字列にする
replace(古, 新) 置換した新しい文字列を返す
strip() / lstrip() / rstrip() 前後 / 先頭 / 末尾の空白を除去
upper() / lower() 大文字 / 小文字に変換
find(文字) 位置を返す(無ければ -1)
index(文字) 位置を返す(無ければエラー)
文字 in 文字列 含むかどうか(True / False)
count(文字) 出現回数を数える
startswith() / endswith() 先頭 / 末尾の一致を調べる
zfill(桁) 先頭を 0 で埋めて桁をそろえる

よくある失敗

replaceの結果を変数で受け取らない

文字列は変更できないため、s.replace(...)だけでは元のsは変わりません。s = s.replace(...)と代入し直します。

findの戻り値をそのままif判定に使う

先頭(位置0)で見つかると0が返り、ifではFalse扱いになります。if s.find(x) != -1:と比較します。

数値が混ざったリストをjoinする

join()は文字列専用です。数値はstr()で変換してから連結します。

split()とsplit(” “)を混同する

引数なしは連続空白をまとめて空要素を残しません。区切りを指定すると空要素が残ります。

無い文字をindexで探してエラーになる

見つからない可能性があるならfind()(-1が返る)やinを使います。

よくある質問

Qreplaceしても文字列が変わりません。
A文字列は変更できない(イミュータブル)ため、replace()は元の文字列を書き換えず、置換後の新しい文字列を返します。s = s.replace("古", "新")のように、結果を変数で受け取ってください。strip()upper()も同じです。
Qfindとindexの違いは?
Aどちらも文字の位置を返しますが、見つからなかったときの動きが違います。find()-1を返し、index()ValueErrorでエラーになります。見つからない可能性があるならfind()、確実に存在する前提ならindex()を使います。
Q文字列にある単語が含まれるか調べるには?
A"探す文字" in 文字列True/Falseが得られます。位置まで知りたいときはfind()を使い、戻り値が-1でなければ含まれていると判定します。
Qsplit()とsplit(” “)はどう違いますか?
A引数なしのsplit()は連続する空白をまとめて分割し、空の要素を残しません。split(" ")はスペース1個ごとに分割するため、連続スペースがあると空文字が要素として残ります。空白区切りをきれいに分けたいなら引数なしが便利です。
Q数字を001のようにゼロ埋めするには?
Astr(数値).zfill(桁数)を使います。str(7).zfill(3)"007"になります。rjust(3, "0")でも同じことができ、こちらは埋める文字を指定できます。

まとめ

  • 分割はsplit()、連結は"区切り".join(リスト)。逆の操作です。
  • replace()などは新しい文字列を返すので、s = s.replace(...)で受け取ります。
  • 前後の空白除去はstrip()(片側はlstrip()/rstrip())。
  • 検索はfind()(-1)・index()(エラー)・inを使い分けます。
  • 先頭・末尾の判定はstartswith()/endswith()、ゼロ埋めはzfill()

文字列メソッドは種類が多いですが、まずはsplitjoinreplacestripの4つを押さえれば、日々のデータ整形の大半をこなせます。「文字列は変更できないので結果を受け取る」という1点を意識すれば、思った通りに動かないトラブルも避けられます。