- Python
Python 文字列操作 一覧|全メソッド逆引きと3.14実行結果
Pythonの文字列操作は、str 型のメソッド(find・replace・split・strip など)と、スライス・in・+ などの演算、標準ライブラリの re(正規表現)や unicodedata の組み合わせで書けます。 文字列は変更できない値(イミュータブル)なので、どのメソッドも元の文字列を変えず、新しい文字列を返します。
この記事では、Python 3.14の str が持つ47個のメソッドを「やりたいこと」別の逆引き表で整理し、主要なものを Python 3.14.7(uvで導入)で実行した結果をテキストで載せています。コピペしてそのまま試せます。さらに、isdigit・isdecimal・isnumeric の違いを全角数字・漢数字・「½」で実行比較し、+= と join の速度の実測、NFKCによる全角半角変換、strip と removeprefix の違いなど、つまずきやすい点もまとめました。
Python 文字列操作の早見表(逆引き)
| やりたいこと | コード | 結果(例) |
|---|---|---|
| 含むか | "0915" in s |
True |
| 位置を探す | s.find("x") / s.rfind("x") |
無ければ -1 |
| 位置を探す(無ければエラー) | s.index("x") |
ValueError |
| 出現回数 | s.count("x") |
2 |
| 先頭・末尾が一致 | s.startswith("a") / s.endswith((".csv", ".tsv")) |
タプルで複数指定可 |
| 置換 | s.replace("a", "b") / s.replace("a", "b", 1) |
全件/先頭1件 |
| 1文字ずつ置換・削除 | s.translate(str.maketrans(...)) |
複数文字を一括 |
| 区切りで分割 | s.split(",") / s.split() |
引数なしは空白の連続で分割 |
| 右から分割 | s.rsplit("/", 1) |
['dir/sub', 'file.txt'] |
| 行ごとに分割 | s.splitlines() |
\r\n も対応 |
| 最初の区切りで3分割 | s.partition("=") |
('key', '=', 'value=1') |
| リストを結合 | ",".join(lst) |
要素は文字列のみ |
| 前後の空白を除く | s.strip() / lstrip / rstrip |
全角スペース・改行も除く |
| 接頭辞・接尾辞を除く | s.removeprefix("ID-") / s.removesuffix(".csv") |
3.9以降 |
| ゼロ埋め | "42".zfill(5) |
'00042' |
| 幅をそろえる | center(9, "*") / ljust(6) / rjust(6) |
'***abc***' |
| 大文字・小文字 | upper() / lower() / casefold() |
比較は casefold |
| 単語の先頭を大文字 | title() / capitalize() |
'Hello World' |
| 数字だけか | s.isdecimal() |
全角数字も True |
| 英数字だけか(ASCII限定) | s.isascii() and s.isalnum() |
|
| 一部を取り出す | s[0:6] / s[-1] |
スライス |
| 逆順 | s[::-1] |
|
| バイト列に変換 | s.encode("utf-8") / b.decode("utf-8") |
|
| 全角英数→半角 | unicodedata.normalize("NFKC", s) |
半角カナ→全角も同時 |
| 正規表現で置換・分割 | re.sub(...) / re.split(...) |
|
| 変数を埋め込む | f"{name}を{qty}個" |
f-string |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python 文字列操作 一覧|全メソッド逆引きと3.14実行結果」
str の全メソッド一覧(目的別)
Python 3.14.7で dir(str) から _ で始まる名前を除くと47個でした。 目的別に分類します。
| 目的 | メソッド |
|---|---|
| 検索 | find rfind index rindex count startswith endswith |
| 置換 | replace translate maketrans expandtabs |
| 分割・結合 | split rsplit splitlines partition rpartition join |
| 整形(削除) | strip lstrip rstrip removeprefix removesuffix |
| 整形(埋める) | zfill center ljust rjust |
| 大文字・小文字 | upper lower casefold title capitalize swapcase |
| 判定(数字) | isdecimal isdigit isnumeric |
| 判定(文字種) | isalpha isalnum isascii isspace isupper islower istitle isidentifier isprintable |
| 書式 | format format_map |
| エンコード | encode |
検索する:find・index・count・startswith・in
s = "order-2026-0915-order"
print(s.find("order"), s.rfind("order"), s.find("zzz"))
print(s.index("2026"), s.count("order"))
print(s.startswith("order"), s.endswith(("-order", "-item")), "0915" in s)
s.index("zzz")
0 16 -1
6 2
True True True
ValueError: substring not found
含むかだけを知りたいなら in、位置が必要なら find(無ければ -1) を使います。index は見つからないと ValueError になるので、「必ずあるはず」の場面で使うと異常にすぐ気づけます。endswith と startswith はタプルで複数の候補を一度に判定できます。
置換する:replace・translate
t = "pen,pen,note"
print(t.replace("pen", "ペン"), t.replace("pen", "ペン", 1))
table = str.maketrans({"-": "/", " ": None}) # None は削除
print("2026-09-28 10:00".translate(table))
print("abc123".translate(str.maketrans("abc", "ABC", "123")))
ペン,ペン,note ペン,pen,note
2026/09/2810:00
ABC
replace は既定で全件を置換し、第3引数で回数を指定できます。 1文字単位の置換・削除を複数まとめて行うなら translate が向いています。maketrans の第3引数は「削除する文字」です。
分割・結合する:split・splitlines・partition・join
line = "pen, note , tape"
print(line.split(","), [w.strip() for w in line.split(",")])
print("a b\tc\n".split(), "a,,b".split(","), "a b c d".split(" ", 2))
print("dir/sub/file.txt".rsplit("/", 1))
print("1行目\n2行目\r\n3行目".splitlines(), "x\ny\n".split("\n"))
print("key=value=1".partition("="), "file.tar.gz".rpartition("."))
print("-".join(["2026", "09", "28"]))
",".join([1, 2])
['pen', ' note ', ' tape'] ['pen', 'note', 'tape']
['a', 'b', 'c'] ['a', '', 'b'] ['a', 'b', 'c d']
['dir/sub', 'file.txt']
['1行目', '2行目', '3行目'] ['x', 'y', '']
('key', '=', 'value=1') ('file.tar', '.', 'gz')
2026-09-28
TypeError: sequence item 0: expected str instance, int found
| 書き方 | 動き |
|---|---|
s.split()(引数なし) |
空白・タブ・改行の連続を1つの区切りとし、前後の空白も無視 |
s.split(",") |
区切りが連続すると空文字 '' が入る |
s.split(",", 2) |
最大2回だけ分割 |
s.splitlines() |
\n・\r\n どちらでも行に分ける。末尾の空行は作らない |
s.partition("=") |
最初の1つで必ず3要素に分ける(無ければ (s, '', '')) |
join に数値が混ざると TypeError になります。 ",".join(map(str, [1, 2])) で文字列に変えてから結合すると '1,2' になります。
空白・接頭辞を取り除く・幅をそろえる
u = " 注文 \n" # 先頭は全角スペース
print(f"[{u.strip()}]")
print("xxabcxx".strip("x"), "https://example.com/".rstrip("/"))
print("report.csv".removesuffix(".csv"), "ID-0042".removeprefix("ID-"))
print(repr("ID-DI".strip("ID-")), repr("ID-DI".removeprefix("ID-")))
print("42".zfill(5), "-42".zfill(5), "abc".center(9, "*"), "abc".ljust(6, ".") + "|", "abc".rjust(6) + "|")
[注文]
abc https://example.com
report 0042
'' 'DI'
00042 -0042 ***abc*** abc...| abc|
strip("ID-") は「I・D・- のどれか」を両端から取り続けるため、"ID-DI" は空文字になります。 決まった文字列を1回だけ取り除きたいときは removeprefix / removesuffix(3.9以降) を使うと意図どおりになります。引数なしの strip() は全角スペースや改行も取り除きます。
大文字・小文字を変換する
w = "hello wORLD it's"
print(w.upper(), "|", w.lower(), "|", w.title(), "|", w.capitalize(), "|", w.swapcase())
print("Straße".lower(), "Straße".casefold(), "Straße".upper())
print("STRASSE".casefold() == "straße".casefold(), "STRASSE".lower() == "straße".lower())
print("ABC".lower())
HELLO WORLD IT'S | hello world it's | Hello World It'S | Hello world it's | HELLO World IT'S
straße strasse STRASSE
True False
abc
title()はアポストロフィの後も大文字にするためIt'Sになります。英文の見出し用途ではstring.capwords(w)も候補です。- 大文字小文字を無視した比較は
casefold()が確実です(ドイツ語の ß なども揃う)。 - 全角英字も大文字小文字の変換対象ですが、全角→半角にはなりません。
文字の種類を判定する:isdigit・isdecimal・isnumeric の違い
3つとも「数字か」を判定しますが、どこまでを数字とみなすかが違います。 実際に全角数字・分数・上付き・漢数字で比較しました。
samples = ["123", "123", "½", "²", "一二三", "12.5", "-1", "abc", "あいう", "", " "]
for v in samples:
print(repr(v), v.isdecimal(), v.isdigit(), v.isnumeric(), v.isalpha(), v.isalnum(), v.isascii())
| 値 | isdecimal | isdigit | isnumeric | isalpha | isalnum | isascii |
|---|---|---|---|---|---|---|
'123' |
True | True | True | False | True | True |
'123'(全角) |
True | True | True | False | True | False |
'½' |
False | False | True | False | True | False |
'²'(上付き) |
False | True | True | False | True | False |
'一二三'(漢数字) |
False | False | True | True | True | False |
'12.5' |
False | False | False | False | False | True |
'-1' |
False | False | False | False | False | True |
'abc' |
False | False | False | True | True | True |
'あいう' |
False | False | False | True | True | False |
''(空) |
False | False | False | False | False | True |
' ' |
False | False | False | False | False | True |
数字とみなす範囲は isdecimal → isdigit → isnumeric の順に広くなります。 次の点に注意します。
int()に変換できるかの判定にはisdecimal()が合います。全角数字もTrueで、実際にint("123")は123、float("12.5")は12.5になりました。- 漢数字は
isnumeric()がTrueでもint("一二三")はValueError: invalid literal for int() with base 10: '一二三'になります。 - 小数点やマイナス記号を含むと3つとも
Falseです。数値として読めるかはtry: float(s)で確かめます。 isalpha()はひらがな・漢字もTrueです。半角英字だけに限るならs.isascii() and s.isalpha()とします。- 空文字は
isascii()だけTrue、それ以外はFalseです。
その他の判定も実行しました。
print(" \t\n".isspace(), " ".isspace(), "".isspace())
print("Abc".isupper(), "ABC".isupper(), "abc1".islower(), "Hello World".istitle(), "var_1".isidentifier(), "abc\n".isprintable())
True True False
False True True True True False
スライスで取り出す・逆順にする
s = "Python文字列"
print(s[0], s[-1], s[0:6], s[6:], s[::-1], s[::2], len(s))
s[0] = "p"
P 列 Python 文字列 列字文nohtyP Pto文列 9
TypeError: 'str' object does not support item assignment
文字列は一部だけを書き換えられないので、"p" + s[1:] のように新しい文字列を作ります。 len() は日本語も1文字を1と数えます。ただし、濁点が分かれた「か+゛」(結合文字)は2と数えられ、unicodedata.normalize("NFC", s) で1文字にまとめると "が" と一致しました。
文字列の結合:+ と join の速度を実測
大量の文字列をつなぐときは、リストに集めて最後に join するのが基本です。 Python 3.14.7で "item" を10万個つないだ時間(timeit、1回あたり)です。
| 方法 | 時間 |
|---|---|
",".join(words) |
1.39 ms |
リストに append してから join |
3.15 ms |
s += w + "," をループ |
8.74 ms |
内包表記で f"{w}," を作って join |
11.12 ms |
CPythonには s += w を速くする最適化がありますが、同じ文字列を別の変数も参照していると効きません。 ループ内で prev = s のように参照を残した場合を比べると、差が大きく広がりました。
| 件数 | +=(参照なし) |
+=(別変数も参照) |
join |
|---|---|---|---|
| 1万 | 0.30 ms | 6.24 ms | 0.06 ms |
| 4万 | 2.13 ms | 264.05 ms | 0.20 ms |
件数が4倍で約42倍に増えるのは、毎回全体をコピーしているためです。 少数の結合なら + やf-stringで読みやすく書き、ループで積み上げるときは join を選ぶと安定します。
エンコード・デコード(bytesとの変換)
jp = "注文ABC"
b8 = jp.encode("utf-8"); bs = jp.encode("shift_jis")
print(b8, len(b8), len(bs), len(jp))
print(b8.decode("utf-8"))
print("①".encode("cp932"))
b8.decode("shift_jis")
b'\xe6\xb3\xa8\xe6\x96\x87ABC' 9 7 5
注文ABC
b'\x87@'
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 5: illegal multibyte sequence
UTF-8では日本語1文字が3バイト、Shift_JISでは2バイトです。「①」はShift_JISでは変換できず(UnicodeEncodeError、理由は illegal multibyte sequence)、Windows向けの cp932 なら変換できます。変換できない文字を ? に置き換えるなら encode("cp932", errors="replace") とします。CSVの文字コードの扱いは「PythonでCSVを読み書き」の記事で詳しく扱っています。
全角・半角を変換する(unicodedata.normalize)
全角英数字を半角にするなら unicodedata.normalize("NFKC", s) が1行で使えます。 ただし、半角カナの全角化や丸数字・記号の分解も同時に行われます。
import unicodedata
src = "ABC123 カタカナ ①㈱ パン"
print(unicodedata.normalize("NFKC", src))
ABC123 カタカナ 1(株) パン
英数字と記号だけを変換したいときは、範囲を限定した translate にします。
def to_half(s: str) -> str:
"""全角英数字・記号(!〜~)と全角スペースだけを半角にする"""
table = {c: c - 0xFEE0 for c in range(0xFF01, 0xFF5F)}
table[0x3000] = 0x20
return s.translate(table)
def kata_to_hira(s: str) -> str:
return "".join(chr(ord(c) - 0x60) if "ァ" <= c <= "ヶ" else c for c in s)
print(to_half("ABC123! カタカナ①"))
print(kata_to_hira("カタカナとヴ"))
ABC123! カタカナ①
かたかなとゔ
| 方法 | 全角英数→半角 | 半角カナ→全角 | ①→1 | 用途 |
|---|---|---|---|---|
normalize("NFKC", s) |
する | する | する | 検索用の正規化、入力のゆれ吸収 |
to_half(上の関数) |
する | しない | しない | 表示用に英数字だけ揃える |
正規表現で置換・分割する(re)
メソッドで表せないパターン(「数字の連続」「空白の連続」など)は re モジュールを使います。
import re
print(re.sub(r"\s+", " ", "a b\t\tc"))
print(re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\1年\2月\3日", "2026-09-28"))
print(re.split(r"[、,\s]+", "pen、note, tape glue"))
print(re.findall(r"\d+", "注文12件、返品3件"))
print(re.fullmatch(r"[A-Z]{2}-\d{4}", "AB-0042") is not None)
a b c
2026年09月28日
['pen', 'note', 'tape', 'glue']
['12', '3']
True
パターンは r"..."(raw文字列)で書くと、\d のバックスラッシュがそのまま渡ります。 形式チェックには部分一致の search ではなく全体一致の fullmatch を使います。記号の一覧は「正規表現 早見表」の記事にまとめています。
変数を埋め込む:f-string と t-string
name, qty, price = "ペン", 3, 1234.5
print(f"{name}を{qty}個、合計{price * qty:,.0f}円", f"{qty:03d}", f"{name=}")
ペンを3個、合計3,704円 003 name='ペン'
:,.0f(3桁区切り・小数0桁)や :03d(ゼロ埋め)などの書式指定は「Python f-string書式指定」の記事に全項目の早見表があります。 なお、Python 3.14では t"..." と書く t-string(テンプレート文字列) が加わり、文字列ではなく string.templatelib.Template を返します(実行すると t.strings が ('', 'を', '個')、t.values が ('ペン', 3))。
よくある質問
Q. 文字列に特定の文字が含まれるか調べる一番簡単な方法は?
A. "x" in s です。 位置も必要なら s.find("x")(無ければ -1)、大文字小文字を無視するなら "x" in s.casefold() とします。
Q. 文字列を1文字ずつのリストにするには?
A. list(s) です。 list("abc") は ['a', 'b', 'c'] になります。逆にリストを文字列に戻すには "".join(lst) を使います。
Q. 入力が数字だけかを確認するには、どのメソッドを使えばよいですか?
A. 整数に変換する前提なら isdecimal() が合います。全角数字も True になり、int() で変換できます。半角だけに限るなら s.isascii() and s.isdecimal() とします。
Q. 文字列の一部を書き換えるには?
A. 文字列は変更できないため、replace やスライスで新しい文字列を作って代入し直します。 例:s = s[:3] + "X" + s[4:]。
まとめ
- 文字列のメソッドは元の文字列を変えず、新しい文字列を返す(3.14では47個)
- 含むかは
in、位置はfind、置換はreplace、分割はsplit、結合はjoin strip("ID-")は文字の集合として取り除く。決まった文字列はremoveprefix/removesuffixint()できるかの判定はisdecimal()。isnumeric()は漢数字や「½」もTrue- ループでの連結は
join。+=は参照が残ると大きく遅くなる(4万件で264 ms 対 0.2 ms) - 全角英数→半角は
unicodedata.normalize("NFKC", s)。カナや記号も変わる点に注意 - メソッドで足りないパターンは
re.sub/re.splitで処理する
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python 文字列操作 一覧|全メソッド逆引きと3.14実行結果」
株式会社RJCでは、毎日使う基本の操作も実際に動かして確かめ、その結果をプロジェクトの中で仲間と共有しています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。