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 / removesuffix
  • int() できるかの判定は 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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?