💡 この記事でわかること
- 文字列のメソッドは「元の文字列を変えず、新しい文字列を返す」というしくみ
- 文字数の数え方(
len)と、大文字・小文字の変換 strip・replaceで、空白の除去や置き換えをする方法- スライス・
in・startswithなどで、一部を取り出す・含まれるか調べる方法 split・joinでの分割・連結と、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, PYTHON3. 空白の除去と置き換え(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から数え、マイナスを使うとうしろから数えられます。
ただし、文字列は取り出すことはできても、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()で文字列に変換してから連結)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() を使って例外を捕まえる方法が確実です。
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の
{値:書式}でそろえられる
👉 メソッドを全部覚える必要はありません。「やりたいこと(数える・置き換える・分ける)」から早見表で引けるようにしておき、細かい使い方はその都度調べる、という進め方で十分です。