文字列の分割・連結・置換・空白の除去などは、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()は文字列を区切りで分割し、リストを返します。引数を省略すると空白(スペース・タブ・改行)で分割し、区切り文字を指定すればその文字で分割します。
# 引数なし → 空白で分割(連続する空白はまとめて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()は連続する空白をまとめて扱い、"a b c"(空白が複数)でも['a', 'b', 'c']ときれいに分割し、空の要素を残しません。一方、区切りを指定したsplit(",")は"a,b,,c"を['a', 'b', '', 'c']と分割し、連続する区切りの間に空文字が残ります。スペース区切りのデータをきれいに分割したいときは、引数なしのsplit()が便利です。
連結する join
リストを1つの文字列にまとめるにはjoin()を使います。「区切り文字」のメソッドとして呼ぶ点が独特で、"区切り".join(リスト)と書きます。
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([2026, 6, 23])のように数値が混ざっているとTypeErrorになります。数値のリストを連結したいときは、"-".join(str(n) for n in numbers)のように、先にstr()で文字列へ変換してください。split()とjoin()は「分割」と「連結」で逆の関係になっており、セットで覚えると便利です。
置換する replace(と immutable)
replace(古い文字列, 新しい文字列)で文字を置き換えます。標準では見つかったものをすべて置換します。ここで大切なのが、文字列は変更できないという点です。
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(".", "/")を呼んだあとも元のsはa.b.cのままでした。replace()は元の文字列を書き換えず、置換後の新しい文字列を返すためです。結果を残したいときはs = s.replace(...)のように変数へ代入し直します。これはstrip()やupper()など、ほかの文字列メソッドにも共通する考え方です。第3引数で置換する回数を指定することもできます。
前後の空白を取り除く strip
入力データの前後についた空白や改行を取り除くにはstrip()を使います。フォーム入力やファイルから読んだ行の整形でよく使います。
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()を使います。比較の前に大小をそろえる(大文字小文字を区別しない検索)などに使います。
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()は、見つからなかったときの動きが違うので注意します。
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
実機で確認したところ、"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の判定などに便利です。
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で埋めます。
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を使います。
よくある質問
replace()は元の文字列を書き換えず、置換後の新しい文字列を返します。s = s.replace("古", "新")のように、結果を変数で受け取ってください。strip()やupper()も同じです。find()は-1を返し、index()はValueErrorでエラーになります。見つからない可能性があるならfind()、確実に存在する前提ならindex()を使います。"探す文字" in 文字列でTrue/Falseが得られます。位置まで知りたいときはfind()を使い、戻り値が-1でなければ含まれていると判定します。split()は連続する空白をまとめて分割し、空の要素を残しません。split(" ")はスペース1個ごとに分割するため、連続スペースがあると空文字が要素として残ります。空白区切りをきれいに分けたいなら引数なしが便利です。str(数値).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()。
文字列メソッドは種類が多いですが、まずはsplit・join・replace・stripの4つを押さえれば、日々のデータ整形の大半をこなせます。「文字列は変更できないので結果を受け取る」という1点を意識すれば、思った通りに動かないトラブルも避けられます。

