基礎

Pythonの文字列:split、replace、strip、join、スライス、f文字列

更新日: · Skillaria.Top

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のためにデータを安全にエスケープできます。

動画でこのテーマを学ぶ

このテーマはコース「Python 3.15: от новичка до профи」で実践とともに詳しく解説しています。

コースへ