Q1word = "python" のとき、word[-2] の値はどれですか?
文字列型 (str) の使い方
Python の文字列型 str の使い方を基礎から解説します。クォートの種類、スライス、replace や strip などの主要メソッドまで一通り図解で押さえます。
文字列の作り方
文字列(str)は「文字の並び」を表す型です。Pythonでは クォート(引用符)で囲んだ値が str です。
囲み方は3種類あり、用途によって使い分けます。
どれを使っても同じ str 型です。
選ぶ基準は「文中にどの記号が出てくるか」と「改行を含めるかどうか」。
改行を入れたいときは、\n というエスケープシーケンスを使うか、トリプルクォートで囲むかのどちらかを利用します。
# シングル/ダブルは 1 行用
fruit1 = 'apple'
fruit2 = "banana"
# 文中に ' があるときはダブルで囲むと楽
message = "it's a pen"
# 改行を含めたい → \n か、トリプルクォート
text_a = "apple\nbanana\ngrape"
text_b = """apple
banana
grape"""
print(fruit1, fruit2) # apple banana
print(message) # it's a pen
print(text_a) # 3 行に分かれて表示
print(text_b) # text_a と同じ結果
位置で取り出す(インデックスとスライス)
文字列は位置(インデックス)を指定して取り出すこともできます。
0 始まりである点に注意してください。「最初の文字は 1 番目」ではなく「0 番目」と数えます。
1 文字を取り出す — [i]
文字列[位置] と書くと、その位置の 1 文字を取り出せます。
マイナスを指定すると末尾から数えます。-1 が一番最後の文字です。
fruit = "lemon" # l e m o n
print(fruit[0]) # l (先頭)
print(fruit[2]) # m (3 つ目)
print(fruit[-1]) # n (末尾)
print(fruit[-2]) # o (末尾から 2 つ目)
# 範囲外を指定するとエラー
# print(fruit[10]) # IndexError
複数文字を切り出す — スライス [a:b]
文字列[開始:終了] と書くと、開始の位置から、終了の 1 つ手前までをまとめて取り出せます。これをスライスと呼びます。
「終了の1 つ手前まで」という半開区間がポイントです。[0:3] なら 0,1,2 の 3 文字で、3 は含みません。
[a:b] は a 含む・b 含まない。
a を省くと先頭から、b を省くと末尾まで。
マイナスも使えて、[-3:] は末尾 3 文字。
msg = "0123456789"
print(msg[0:3]) # '012' (3 は含まない)
print(msg[:4]) # '0123' (先頭から)
print(msg[4:]) # '456789'(末尾まで)
print(msg[-3:]) # '789' (末尾 3 文字)
print(msg[:-3]) # '0123456'(末尾 3 文字を除く)
さらに [開始:終了:ステップ] のように 3 つ目の数字を付けると、飛ばし飛ばしに取り出せます。[::2] なら 1 つおきです。
ただしステップと範囲を同じ行に詰め込むと読みづらくなるので、長い場合は 2 行に分けて書くのがおすすめです。
msg = "0123456789"
# [::ステップ] で飛ばし飛ばしに取り出す
print(msg[::2]) # '02468' (1 つおき)
print(msg[::3]) # '0369' (2 つおき)
# ステップは分けて書くと読みやすい
head = msg[:6] # '012345'
skip = head[::2] # '024'(1 つおき)
print(skip)
変換するメソッド
文字列には、自分自身を元に新しい文字列を作る機能が用意されていて、これをメソッドと呼びます。
呼び出し方は 変数.メソッド名() の形。ポイントは、元の文字列は書き換わらず、新しい文字列が返されることです。
大文字・小文字を揃える — upper / lower
upper() はすべて大文字に、lower() はすべて小文字に変換します。
よく使うのは、大文字小文字の違いを無視して比較したい場面です。ユーザーが入力する名前やメールアドレスは揺れやすいので、片方に揃えてから比較します。
name = "Alice"
print(name.lower()) # alice
print(name.upper()) # ALICE
print(name) # Alice (元は変わらない)
# 大文字小文字を無視して同じ名前か判定
input_a = "ALICE"
input_b = "alice"
print(input_a.lower() == input_b.lower()) # True
置き換えと両端の削除 — replace / strip
replace("前", "後") は、文字列中の「前」を「後」に置き換えた新しい文字列を返します。
strip() は両端の空白を取り除くメソッド。入力フォームにうっかり入った余計なスペースを消すのによく使います。
greeting = "Hello World"
print(greeting.replace("World", "Python")) # Hello Python
print(greeting) # Hello World(元は変わらない)
# 余計な空白を削る(両端だけ。中のスペースは残る)
raw = " alice@example.com "
print(raw.strip()) # 'alice@example.com'
print(len(raw)) # 21(空白を含む)
print(len(raw.strip())) # 17(空白が消えた)
調べるメソッド
次は「値を変えず、文字列について何かを教えてくれる」系のメソッドです。
ある文字が含まれるかをカウントしたり、先頭・末尾をチェックしたり、位置を探したり、文字種を判定したりします。
含まれるかを調べる — count / startswith / endswith / find
- count("文字") — 何回登場するかを数値で返す
- startswith("文字") — その文字で始まっているか(True / False)
- endswith("文字") — その文字で終わっているか(True / False)
- find("文字") — 最初に見つかった位置を返す。見つからなければ
-1
msg = "abcCBAabc"
print(msg.count("a")) # 3 (a は 3 つ)
print(msg.count("abc")) # 1 (abc は 1 回だけ続けて登場)
print(msg.startswith("abc")) # True
print(msg.endswith("abc")) # True
print(msg.find("CBA")) # 3 (3 番目から始まる)
print(msg.find("xyz")) # -1 (無ければ -1)
ファイル拡張子の判定は endswith が定番
filename.endswith(".png") のように書けば、拡張子が画像ファイルかどうかを手軽にチェックできます。大文字小文字を区別するので、混在が心配なら filename.lower().endswith(".png") にしておくと安全です。
文字種を判定する — isdigit / isalpha / islower / isupper
is◯◯() 系のメソッドは、文字列全体がその条件を満たすかを True / False で返します。空白や記号が混ざっていると Falseになる点に注意しましょう。
| メソッド | True になるとき |
|---|---|
| isdigit() | 文字がすべて数字 (0-9) のみ |
| isalpha() | 文字がすべてアルファベット or 漢字・ひらがな(空白・数字・記号があると False) |
| isupper() | アルファベットがすべて大文字 |
| islower() | アルファベットがすべて小文字 |
print("123".isdigit()) # True
print("12a".isdigit()) # False(a が混ざっている)
print("Tokyo".isalpha()) # True
print("Tokyo 2024".isalpha())# False(空白と数字が混ざる)
print("HELLO".isupper()) # True
print("Hello".islower()) # False
「数値に変換できるか」のチェックには注意
isdigit() は 0 以上の整数っぽい文字列にしか True を返しません。"-12" や "3.14" はどちらも False になります。マイナスや小数点を含む文字列を数値として扱いたいときは、isdigit() ではなく int() / float() に渡して例外処理で判定しましょう。
この記事では、クォートの 3 種類とインデックス/スライスによる切り出し、そして 変換・調査系のメソッド を学びました。
文字列はプログラムの中で最も登場回数が多い型の 1 つです。ここで登場したメソッドは、次の記事以降でユーザー入力を扱う際にもそのまま使えるので、手を動かして感覚をつかんでおきましょう。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2s = "abcdefg" のとき、s[1:4] の結果はどれですか?
Q3" Hello World ".strip().lower() の結果はどれですか?