順番に読み進めながら学べます

文字列型 (str) の使い方

Python の文字列型 str の使い方を基礎から解説します。クォートの種類、スライス、replace や strip などの主要メソッドまで一通り図解で押さえます。

文字列の作り方

文字列(str)は「文字の並び」を表す型です。Pythonでは クォート(引用符)で囲んだ値が str です。

囲み方は3種類あり、用途によって使い分けます。

クォートの3つの書き方
'apple'シングルクォート1 行の文字列"apple"ダブルクォート中に ' を入れやすい"""..."""トリプルクォート複数行をそのまま型が決まる用途型が決まる用途型が決まる用途

どれを使っても同じ 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 と同じ結果

ターミナルで 3 種類のクォートを試してみましょう。

name = "Alice"message = 'Hello' を作り、両方を print() してください。

\n を使って、「apple」「grape」「lemon」を1 つの変数に入れ、print() で 3 行にわたって表示してください。

③ トリプルクォート(""")を使って、「apple」「grape」「lemon」を1 つの変数に入れ、print() で 3 行にわたって表示してください。

Python エディタ

コードを実行してください

位置で取り出す(インデックスとスライス)

文字列は位置(インデックス)を指定して取り出すこともできます。

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
インデックスの数え方
lemon01234-5-4-3-2-1

word = "python" が用意されています。

word最初の文字最後の文字を、それぞれ print() で表示してください。

word真ん中の文字(4 番目) を、先頭から数えるやり方で表示してください。

Python エディタ

コードを実行してください

複数文字を切り出す — スライス [a:b]

文字列[開始:終了] と書くと、開始の位置から、終了の 1 つ手前までをまとめて取り出せます。これをスライスと呼びます。

「終了の1 つ手前まで」という半開区間がポイントです。[0:3] なら 0,1,2 の 3 文字で、3 は含みません

スライスの取り方
msg= '0123456789'msg[0:3]= '012'msg[:4]= '0123'msg[4:]= '456789'msg[-3:]= '789'msg[:-3]= '0123456'msg[::2]= '02468'a:b:-na:-n:::step

[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)

email = "alice@example.com" が用意されています。

① スライスを使って@ より前のユーザー名 "alice" だけを取り出して表示してください(@ は 5 番目の位置にあります)。

[-3:] を使って末尾 3 文字 "com" を取り出して表示してください。

Python エディタ

コードを実行してください

変換するメソッド

文字列には、自分自身を元に新しい文字列を作る機能が用意されていて、これをメソッドと呼びます。

呼び出し方は 変数.メソッド名() の形。ポイントは、元の文字列は書き換わらず、新しい文字列が返されることです。

メソッドは「新しい文字列を返す」
name= 'alice'.upper()'ALICE'新しい値呼び出す返る

大文字・小文字を揃える — 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()両端の空白を取り除くメソッド。入力フォームにうっかり入った余計なスペースを消すのによく使います。

replace と strip のイメージ
'Hello World'.replace('World','Python')'Hello Python'' hi '.strip()'hi'呼び出し置換結果呼び出し削除結果
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(空白が消えた)

ユーザーが入力したメールアドレスを整える処理を作ってみましょう。

raw_email = " ALICE@Example.COM " が与えられています。

strip()両端の空白を、lower()大文字を小文字にそろえて、きれいな形のメールclean_email に入れてください。

③ 整形前(raw_email)と整形後(clean_email)をそれぞれ print() で表示してください。

Python エディタ

コードを実行してください

調べるメソッド

次は「値を変えず、文字列について何かを教えてくれる」系のメソッドです。

ある文字が含まれるかをカウントしたり、先頭・末尾をチェックしたり、位置を探したり、文字種を判定したりします。

含まれるかを調べる — 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") にしておくと安全です。

ログの中からエラー行らしきものを探す処理を作ってみましょう。

log = "ERROR: disk full at /tmp/log" が与えられています。

log"ERROR" で始まるかを startswith でチェックして表示してください。

log の中に "disk" という単語が何文字目から出てくるかを find で取得して表示してください。

Python エディタ

コードを実行してください

文字種を判定する — 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() に渡して例外処理で判定しましょう。

ユーザーから与えられた文字列が「数値として使える形(0 以上の整数)」かを判定してみましょう。

value = "42" が与えられています。

isdigit()value が数字だけで構成されているかを print() で表示してください。

② その結果が True のときは int() で数値に変換し、10 を足した結果を表示してください。ヒント: isdigit() は if 文の条件にそのまま使えます。

Python エディタ

コードを実行してください

この記事では、クォートの 3 種類インデックス/スライスによる切り出し、そして 変換・調査系のメソッド を学びました。

文字列はプログラムの中で最も登場回数が多い型の 1 つです。ここで登場したメソッドは、次の記事以降でユーザー入力を扱う際にもそのまま使えるので、手を動かして感覚をつかんでおきましょう。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1word = "python" のとき、word[-2] の値はどれですか?

Q2s = "abcdefg" のとき、s[1:4] の結果はどれですか?

Q3" Hello World ".strip().lower() の結果はどれですか?