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

URL: https://skillaria.top/ja/guides/python/stroki-python

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.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 = ""
tpl = t"こんにちは、{name}さん！"
print(tpl.strings)   # ('こんにちは、', 'さん！')
print(tpl.values)    # ('',)
```

これは何に役立つのでしょうか。ライブラリは、結合される前の値を受け取り、処理できます。例えば、HTMLの山かっこをエスケープしたり、SQLのクエリにパラメータを正しく渡したりできます。f文字列では、すでに結合されてしまっているため、このような処理はできません。通常の出力には、今でもf文字列を使ってください。

## まとめ

日常の文字列処理には、少数のツールで十分です。`split()` と `join()` でテキストを分解・組み立てし、`strip()` で入力を整え、`replace()` で部分を置き換え、スライスで一部を切り出し、f文字列で書式を整えて出力します。文字列は変更できないことを忘れないでください。メソッドは新しい文字列を返すので、その結果を保存する必要があります。文字列、数値、f文字列は、家計簿ツールの例を使った講座の講義で実践的に解説しています。

## FAQ

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


---
Source: Skillaria.Top (https://skillaria.top)
