Pythonの文字列操作とは?よく使うメソッドと使い方を解説

PR Python

Pythonの文字列操作とは?よく使うメソッドと使い方を解説

💡 この記事でわかること

  • 文字列のメソッドは「元の文字列を変えず、新しい文字列を返す」というしくみ
  • 文字数の数え方(len)と、大文字・小文字の変換
  • stripreplaceで、空白の除去や置き換えをする方法
  • スライス・instartswithなどで、一部を取り出す・含まれるか調べる方法
  • splitjoinでの分割・連結と、f-stringでの書式指定

1. 文字列操作とは?

文字列操作とは、
👉 文字列(str型)に対して、長さを調べる・置き換える・切り出す・分割するといった加工をすることです。

💡 Pythonの文字列には、こうした加工のための「メソッド」が最初から数多く用意されています。フォーム入力の整形、ファイル名の処理、ログの解析など、実際のプログラムでは文字列の加工が何度も登場するので、よく使うものを一通り知っておくと役立ちます。

メソッドは 文字列.メソッド名() の形で呼び出します。

👉 Pythonのデータ型(文字列・数値・型変換)についての記事はこちら


2. 文字数と大文字・小文字(len・upper・lower)

s = "Hello, Python"

print(len(s))       # 13(文字数)
print(s.upper())    # HELLO, PYTHON(すべて大文字)
print(s.lower())    # hello, python(すべて小文字)

print("python tutorial".capitalize())   # Python tutorial(先頭だけ大文字)
print(len("こんにちは"))                # 5(日本語も1文字と数える)

👉 len() は文字列の「文字数」を返しますs.len() ではなく len(s) の形で書く点に注意してください。日本語も1文字ずつ数えてくれるので、バイト数を気にする必要はありません。

ここで、文字列のメソッドについて大切なルールがあります。

💡 文字列のメソッドは、元の文字列を書き換えず、変換後の「新しい文字列」を返します。結果を使いたいときは、変数に受け取る必要があります。

s = "Hello, Python"

s.upper()          # 結果を受け取っていないので、何も起きないのと同じ
print(s)           # Hello, Python(sは変わらない)

s = s.upper()      # 変換結果を変数に入れ直す
print(s)           # HELLO, PYTHON

3. 空白の除去と置き換え(strip・replace)

ユーザーの入力には、前後に余計な空白や改行が付いていることがよくあります。strip() を使うと、前後の空白(スペース・改行・タブ)を取り除けます。

text = "  taro  "

print(f"[{text.strip()}]")    # [taro](前後の空白を除去)
print(f"[{text.lstrip()}]")   # [taro  ](左側だけ除去)
print(f"[{text.rstrip()}]")   # [  taro](右側だけ除去)

文字列の一部を別の文字列に置き換えるときは replace() を使います。

t = "りんご、みかん、りんご"

print(t.replace("りんご", "ぶどう"))       # ぶどう、みかん、ぶどう(すべて置き換え)
print(t.replace("りんご", "ぶどう", 1))    # ぶどう、みかん、りんご(最初の1つだけ)
print(t.replace("、", ""))                 # りんごみかんりんご(空文字に置き換えると削除)

👉 replace(置き換え前, 置き換え後) はデフォルトで見つかった箇所をすべて置き換えます。3つ目の引数に回数を渡すと、先頭から何回までかを指定できます。元の文字列 t は変わらない点も、先ほどのルールのとおりです。


4. 一部を取り出す・含まれるか調べる

文字列は、リストと同じように「番号(インデックス)」で1文字ずつ、または [開始:終了] で範囲を取り出せます(スライス)。

s = "abcdef"

print(s[0])      # a(最初の1文字)
print(s[-1])     # f(うしろから1文字)
print(s[1:4])    # bcd(1番目から4番目の手前まで)
print(s[:3])     # abc(先頭から3文字)
print(s[3:])     # def(3番目から最後まで)
print(s[::-1])   # fedcba(逆順)

👉 スライスの「終了」の番号は、その手前までを含みます(s[1:4] は1・2・3番目の3文字)。番号は0から数え、マイナスを使うとうしろから数えられます。

👉 Pythonのリストと辞書についての記事はこちら

ただし、文字列は取り出すことはできても、1文字だけを書き換えることはできません。

s = "abcdef"
s[0] = "X"   # TypeError: 'str' object does not support item assignment

👉 文字列は「あとから中身を変更できない」型です。変えたいときは、replace() や、スライスを使って "X" + s[1:] のように新しい文字列を作ります。

次に、「ある文字列が含まれているか」を調べる方法です。

email = "user@example.com"

print("@" in email)                       # True(含まれるか)
print("photo.png".startswith("photo"))     # True(先頭が一致するか)
print("photo.png".endswith(".png"))        # True(末尾が一致するか)
print("photo.png".count("o"))              # 2(出現回数)
print("photo.png".find("."))               # 5(最初に見つかった位置)
print("photo.png".find("z"))               # -1(見つからない)

👉 含まれるかどうかだけを調べたいときは、in が読みやすく確実ですfind() は見つからないと -1 を返すため、次のような書き方をすると意図しない動きになります。

if "photo.png".find("z"):   # NG:-1 は「真」と判定されるので、見つからないのに実行される
    print("見つかりました")     # 表示されてしまう

if "z" in "photo.png":       # OK
    print("見つかりました")

find() は「位置」を知りたいときだけ使い、その場合は -1 かどうかを == -1 のように明示的に比較します。


5. 分割(split)と連結(join)

# 文字列 → リスト
parts = "りんご,みかん,ぶどう".split(",")
print(parts)   # ['りんご', 'みかん', 'ぶどう']

# リスト → 文字列
csv = " / ".join(parts)
print(csv)     # りんご / みかん / ぶどう

👉 split(区切り文字) で文字列をリストに分割し、区切り文字.join(リスト) でリストを1つの文字列に連結しますjoin は「つなぐ文字」のほうに付けて呼び出す点が、初めは少し戸惑いやすいところです。

区切り文字を省略すると、空白で分割します。改行で分けたいときは splitlines() が便利です。

print("a  b   c".split())      # ['a', 'b', 'c'](空白がいくつ続いても区切りになる)
print("a  b   c".split(" "))   # ['a', '', 'b', '', '', 'c'](空の要素ができてしまう)

print("1行目\n2行目\n3行目".splitlines())   # ['1行目', '2行目', '3行目']

join() で連結できるのは、文字列だけが入ったリストです。数値が混ざっているとエラーになります。

numbers = [1, 2, 3]

# ",".join(numbers)   # TypeError: sequence item 0: expected str instance, int found
print(",".join([str(n) for n in numbers]))   # 1,2,3(str()で文字列に変換してから連結)

👉 Pythonの内包表記についての記事はこちら


6. 書式指定(f-string)

文字列に変数を埋め込むf-stringでは、{値:書式} のように「:」のあとに書式を指定すると、桁数や表示の形式をそろえられます。

price = 1234567

print(f"{price:,}円")         # 1,234,567円(3桁区切り)
print(f"{3.14159:.2f}")       # 3.14(小数点以下2桁)
print(f"{7:03d}")             # 007(3桁の0埋め)
print(f"{0.256:.1%}")         # 25.6%(パーセント表示)
print(f"[{'abc':>6}]")        # [   abc](右寄せ6文字)
print(f"[{'abc':<6}]")        # [abc   ](左寄せ6文字)

👉 , は3桁区切り、.2f は小数点以下2桁、03d は0埋めの3桁、>6 / <6 は右寄せ・左寄せを表します。金額や日付の表示をそろえたいときに便利です。

f-stringが使えない古い環境向けのコードでは、次のように .format() を使った書き方も見かけます。

print("{}は{}歳".format("太郎", 20))   # 太郎は20歳

👉 f-stringはPython 3.6から使える書き方です。新しく書くコードでは、読みやすいf-stringを使えば問題ありません。


7. 判定・そのほか覚えておきたいもの

print("12".isdigit())      # True(数字だけ)
print("-5".isdigit())      # False(マイナス記号は数字ではない)
print("3.5".isdigit())     # False(小数点も数字ではない)
print("abc".isalpha())     # True(文字だけ)
print("日本語".isalpha())  # True(日本語の文字も「文字」として扱われる)

print("7".zfill(3))        # 007(0埋め)
print("ab" * 3)            # ababab(繰り返し)
print("=" * 10)            # ==========

👉 isdigit() は「0〜9の数字だけでできているか」を調べます。マイナスや小数点が付いた数は False になり、逆に全角の数字("12")は True になります。入力が数値に変換できるかを確かめたいときは、int() を使って例外を捕まえる方法が確実です。

👉 Pythonの例外処理についての記事はこちら


8. 文字列メソッド 早見表

メソッド・書き方できること
len(s)文字数を数える
upper() / lower() / capitalize()大文字・小文字に変換する
strip() / lstrip() / rstrip()前後(左・右)の空白や改行を取り除く
replace(前, 後)文字列を置き換える(回数の指定も可能)
s[開始:終了]一部を取り出す(スライス)
in / startswith() / endswith()含まれるか・先頭/末尾が一致するかを調べる
find() / count()位置を探す(なければ-1) / 出現回数を数える
split() / 区切り.join()リストに分割 / リストを連結
f"{値:,}" など桁数・表示形式をそろえる
isdigit() / zfill()数字だけか調べる / 0埋めをする

9. まとめ

  • 文字列のメソッドは元の文字列を変えず、新しい文字列を返す(結果は変数に受け取る)
  • 文字数は len()、置き換えは replace()、前後の空白の除去は strip()
  • 一部の取り出しはスライス [開始:終了]、含まれるかの確認は in が確実(find()-1 に注意)
  • 分割・連結は split()join()join できるのは文字列のリストだけ
  • 桁数や3桁区切りなどの表示は、f-stringの {値:書式} でそろえられる

👉 メソッドを全部覚える必要はありません。「やりたいこと(数える・置き換える・分ける)」から早見表で引けるようにしておき、細かい使い方はその都度調べる、という進め方で十分です。

-Python
-, , ,