Pythonの文字列:split、replace、strip、join、スライス、f文字列
Pythonの文字列(str型)は、変更できないUnicodeの文字の並びです。split()は文字列をリストに分割し、join()はリストを1つの文字列に結合し、replace()は部分文字列を置き換え、strip()は前後の空白を取り除きます。どのメソッドも新しい文字列を返します。値を埋め込むならf文字列が便利です。例:f"{name}: {price:.2f}"。
Pythonの文字列は、どんなプログラムにも登場します。ユーザーの入力、ファイル名、CSVの行、APIの応答などです。str 型はテキストをUnicodeで保持するため、日本語や絵文字も設定なしで扱えます。よく使うのは split、replace、strip、join の4つのメソッドで、値を出力するにはf文字列が最も便利です。ここでは、これらを例とともに見ていきます。
Pythonの文字列の仕組み
文字列は、一重引用符か二重引用符で囲みます。どちらを使っても違いはありません。'コーヒー' と "コーヒー" は同じです。三重引用符で囲むと、改行を含む複数行の文字列になり、改行がそのまま保持されます。
name = "コーヒー"
note = """1行目
2行目"""
print(len(name)) # 4 — 文字列の長さ(文字数)
文字列の最も重要な特徴は、変更できないことです。メソッドは文字列を書き換えず、新しい文字列を返します。そのため、s.replace("a", "b") だけでは何も起こりません。s = s.replace("a", "b") と書く必要があります。これは初心者が最もよくするミスです。
特殊文字、改行、raw文字列
改行は \n、タブは \t、バックスラッシュは \\ で表します。接頭辞 r を付けると「raw文字列」になり、バックスラッシュは特殊な意味を持たなくなります。Windowsのパスや正規表現で便利です。
print("合計:\n350円")
path = r"C:\new\table.csv" # \n と \t は特殊文字にならない
長い式は、括弧で囲めば次の行に続けて書けます。括弧の中では、隣り合う文字列リテラルがPythonによって自動的に連結されます。
split:文字列をリストに分割する
split() は、区切り文字で文字列を分割し、リストを返します。引数を省略すると、空白文字(スペース、タブ、改行)で分割し、連続する空白は無視されます。コマンドを解析するときに便利です。
"add コーヒー 250".split() # ['add', 'コーヒー', '250']
"2026-10-16".split("-") # ['2026', '10', '16']
"a,b,,c".split(",") # ['a', 'b', '', 'c']
"key=value=x".split("=", 1) # ['key', 'value=x']
違いに注意してください。区切り文字を明示すると、空の要素も残ります。2つ目の引数 maxsplit は分割の回数を制限し、rsplit() は右側から分割します。テキストを行ごとに分けるには splitlines() を使います。\n と \r\n の両方に対応し、末尾に空の要素を残しません。
text = "コーヒー\nタクシー\n"
text.split("\n") # ['コーヒー', 'タクシー', '']
text.splitlines() # ['コーヒー', 'タクシー']
join:リストを1つの文字列に結合する
join() は逆の操作です。区切り文字の文字列に対して呼び出し、引数にリストの文字列を渡します。
items = ["コーヒー", "タクシー", "昼食"]
print(", ".join(items)) # コーヒー, タクシー, 昼食
print("\n".join(items)) # 1項目ごとに改行
すべての要素が文字列である必要があります。そうでないと TypeError: sequence item 0: expected str instance, int found が発生します。数値は先に変換しましょう。例:", ".join(str(x) for x in amounts)。
文字列の連結と結合
2つの文字列は + で結合でき、* で繰り返せます。例:"-" * 20。ただし、ループの中で数百個の断片を += で連結するのは遅くなります。毎回新しい文字列が作られるからです。断片はリストにまとめ、1回の join() で結合しましょう。文字列と数値は直接 + で結合できません。"合計: " + 5 は TypeError になります。str() を使うか、f文字列を使いましょう。
replace:部分文字列を置き換える
replace(old, new) は、部分文字列のすべての出現を置き換えます。3つ目の引数で置換の回数を制限できます。
price = "1 250,50"
price = price.replace(" ", "").replace(",", ".")
print(float(price)) # 1250.5
"a-b-c".replace("-", "+", 1) # 'a+b-c'
このメソッドは大文字と小文字を区別し、完全一致で検索します。「すべての数字」のようにパターンで置き換えたいときは、re モジュールの re.sub() を使います。
strip、lstrip、rstrip:前後の空白を取り除く
strip() は、両端のスペース、タブ、改行を取り除きます。lstrip() は左側だけ、rstrip() は右側だけを取り除きます。ユーザーの入力やファイルから読んだ文字列では、まず最初に行う処理です。
raw = " コーヒー \n"
raw.strip() # 'コーヒー'
raw.rstrip() # ' コーヒー'
"xxcoffeexx".strip("x") # 'coffee'
引数は部分文字列ではなく、文字の集合です。例えば "abcTextcba".strip("abc") は、順番に関係なく両端の a、b、c をすべて取り除きます。接頭辞や接尾辞だけを取り除きたい場合は、removeprefix() と removesuffix()(Python 3.9以降)を使います。
その他の便利な文字列メソッド
| メソッド | 役割 | 例 → 結果 |
|---|---|---|
lower()、upper() | 大文字・小文字の変換 | "Coffee".lower() → 'coffee' |
startswith()、endswith() | 先頭・末尾の確認 | "a.csv".endswith(".csv") → True |
find() | 部分文字列の位置、なければ -1 | "python".find("t") → 2 |
count() | 出現回数 | "banana".count("a") → 3 |
isdigit() | 数字だけか | "250".isdigit() → True |
zfill() | ゼロで桁を埋める | "7".zfill(3) → '007' |
文字列に部分文字列が含まれるかどうかは、in 演算子で最も簡単に確認できます。例:if "コーヒー" in text.lower():。文字列は == で1文字ずつ大文字・小文字を区別して比較されます。大文字・小文字を区別せずに比較するには、両方を casefold() で変換します。
文字列のスライス
文字列は並びなので、文字に0から始まる番号で直接アクセスできます。負の番号は末尾から数えます。スライス s[start:stop:step] は部分文字列を返します。終わりの位置は含まれません。
s = "Python"
s[0] # 'P'
s[-1] # 'n'
s[0:3] # 'Pyt'
s[2:] # 'thon'
s[::2] # 'Pto'
s[::-1] # 'nohtyP' — 文字列を反転
スライスは範囲外を指定してもエラーになりません。s[0:100] は文字列全体を返します。一方、s[100] は IndexError になります。文字列の文字を番号で書き換えることはできません。s[0] = "J" は TypeError になります。新しい文字列を作りましょう。例:"J" + s[1:]。
f文字列
文字列の前に f を付けると、波かっこの中の式が計算され、その結果が文字列に埋め込まれます。Python 3.6から使える、文字列を整形する基本の方法です。format() より短く書け、古い % 演算子より読みやすいのが特徴です。
item = "コーヒー"
price = 250
print(f"{item}: {price}円") # コーヒー: 250円
print(f"割引後: {price * 0.9}円") # 割引後: 225.0円
print(f"{item=}") # item='コーヒー' — デバッグに便利
数値の整形と配置
波かっこの中でコロンの後に書くものを、フォーマット指定子といいます。小数点以下の桁数、桁区切り、幅、配置を指定できます。
| 記述 | 結果 | 意味 |
|---|---|---|
f"{3.14159:.2f}" | 3.14 | 小数点以下2桁に丸める |
f"{1250000:,}" | 1,250,000 | 桁区切りのカンマ |
f"{1250000:_}" | 1_250_000 | カンマの代わりにアンダースコア |
f"{0.256:.1%}" | 25.6% | パーセント表示 |
f"{'coffee':<10}|" | coffee | | 左寄せ、幅10 |
f"{250:>8}" | 250 | 右寄せ |
f"{7:03d}" | 007 | ゼロで桁を埋める |
配置はターミナルの表を揃えるのに便利です。例:f"{name:<12}{amount:>10.2f}" で列がきれいに揃います。整形は表示するときだけ行いましょう。金額は float ではなく、円単位の int か Decimal で保持してください。0.1 + 0.2 は 0.30000000000000004 になります。
f文字列の中の引用符と改行
Python 3.12(PEP 701)から、f文字列は正式な文法を持つようになりました。波かっこの中で外側と同じ引用符を使えるほか、バックスラッシュや改行も使え、入れ子の深さも制限されなくなりました。波かっこ内のエラーも正確な位置が示されます。古いバージョンでは、中に別の種類の引用符を使ってください。例:f"{d['key']}"。改行は、別の変数に入れるか chr(10) を使いましょう。
複数行のテキストには、三重引用符のf文字列が使えます。例:f"""合計: {total}\n件数: {count}"""。
format()と%:古い書き方
既存のコードには、"{}: {}".format(item, price) や "%s: %d" % (item, price) がよく出てきます。format() の指定子はf文字列と同じです。format() は、テンプレートをデータと分けて保存したい場合、例えば設定ファイルに書いておく場合に今も役立ちます。
文字列の解析:実践例
これまでのメソッドを組み合わせてみましょう。ファイルから " 2026-10-16; コーヒー ; 250,50 \n" のような行が届き、日付、品名、金額(銭単位)を取り出したいとします。手順は、両端を整え、区切り文字で分割し、各部分を整え、型を変換する、の順です。
line = " 2026-10-16; コーヒー ; 250,50 \n"
date, item, raw_amount = [p.strip() for p in line.strip().split(";")]
amount_sen = round(float(raw_amount.replace(",", ".")) * 100)
print(date, item, amount_sen) # 2026-10-16 コーヒー 25050
print(f"{item:<10}{amount_sen / 100:>10.2f}")
部分が3つにならないと、アンパックは ValueError: not enough values to unpack または too many values to unpack で失敗します。実際のコードでは、事前に行をチェックするか、例外を捕まえましょう。引用符やエスケープを含む本物のCSVファイルは、split ではなく標準の csv モジュールで読んでください。
文字列でよくあるミス
- メソッドの結果を保存していない。
s.strip()だけでは何も変わりません。 - 数値のリストに対するjoin。
TypeErrorになります。先にmap(str, ...)で変換しましょう。 - stripに部分文字列を渡す。 引数は文字の集合です。接頭辞を取り除くなら
removeprefix()を使います。 - 大文字・小文字の違いを無視する。
"Coffee" == "coffee"はFalseです。 - Windowsのパスでrを付けない。 バックスラッシュが特殊文字として解釈されます。
t文字列:完成した文字列ではなくテンプレート
Python 3.14 で t文字列が追加されました。f文字列と似ていますが、接頭辞は t です。結果は完成した文字列ではなく、string.templatelib.Template オブジェクトになります。テキストの断片(.strings)と、埋め込まれた値(.values)が別々に保持されます。
name = "<script>"
tpl = t"こんにちは、{name}さん!"
print(tpl.strings) # ('こんにちは、', 'さん!')
print(tpl.values) # ('<script>',)
これは何に役立つのでしょうか。ライブラリは、結合される前の値を受け取り、処理できます。例えば、HTMLの山かっこをエスケープしたり、SQLのクエリにパラメータを正しく渡したりできます。f文字列では、すでに結合されてしまっているため、このような処理はできません。通常の出力には、今でもf文字列を使ってください。
まとめ
日常の文字列処理には、少数のツールで十分です。split() と join() でテキストを分解・組み立てし、strip() で入力を整え、replace() で部分を置き換え、スライスで一部を切り出し、f文字列で書式を整えて出力します。文字列は変更できないことを忘れないでください。メソッドは新しい文字列を返すので、その結果を保存する必要があります。文字列、数値、f文字列は、家計簿ツールの例を使った講座の講義で実践的に解説しています。
よくある質問
Pythonで文字列の長さを調べるにはどうしますか?
len(s) は文字数を返します。日本語や絵文字もUnicodeの文字として数えられます。バイト数が知りたい場合は len(s.encode("utf-8")) を使います。
数値を文字列にしたり、その逆をしたりするにはどうしますか?
str(250) は '250' を返します。int("250") と float("2.5") は逆の変換です。数字の形でない文字列を int() に渡すと ValueError になるので、入力は必ずチェックしましょう。
replaceを使っても文字列が変わらないのはなぜですか?
文字列は変更できず、replace は新しい文字列を返すからです。結果を代入してください。例:s = s.replace("a", "b")
文字列が空かどうかを確認するにはどうしますか?
空の文字列は偽として扱われるので、if not s: で確認できます。空白だけの文字列も空とみなしたい場合は、if not s.strip(): を使います。
t文字列とf文字列の違いは何ですか?
f文字列はすぐに完成したstrを返します。一方、t文字列(Python 3.14以降)はテキストの断片と値を別々に持つTemplateオブジェクトを返します。これによって、HTMLやSQLのためにデータを安全にエスケープできます。