文字列
テキストはほとんどすべてのプログラムに登場します。名前、メッセージ、スコア、ラベルなど。Pythonでは、テキストの一片は文字列と呼ばれます。引用符で囲んだ値はすべて文字列です。シングルクオートでもダブルクオートでも、どちらも同じように動作します。
greeting = "Hello, world"
username = 'タロウ'引用符の選択が問題になるのは、テキストに引用符自体が含まれているときだけです。エスケープしなくて済むように、反対のスタイルを使いましょう:
note = "It's a great day" # アポストロフィを含むのでダブルクオートを使う
message = 'She said "hello"' # ダブルクオートを含むのでシングルクオートを使う
escaped = "She said \"hello\"" # またはバックスラッシュでエスケープするイミュータビリティ(不変性)
文字列は**不変(immutable)**です: 一度作成したら、変更することはできません。文字列は作られた瞬間に永久に固定されると考えてください。文字列を変更しているように見える操作は、実際には新しい文字列を生成しているのです。元の文字列はそのまま残ります。
name = "タロウ"
name = name.upper() # "タロウ" は新しい文字列で、元の "タロウ" は変更されない直接的な結果: 特定の位置の文字を変更することはできません。やろうとするとPythonはエラーを発生させます。
name = "タロウ"
name[0] = "ハ" # TypeError: 'str' object does not support item assignment変更された文字列を得るには、スライスやメソッドを使って新しい文字列を作ります。どちらも以下で扱います。
インデックスとスライス
文字列の各文字には、0から始まる番号付きの位置があります。その位置番号を角括弧に入れることで、個々の文字を読み取れます。負の数は末尾から逆向きに数えます。
word = "Python"
# 012345
print(word[0]) # "P"
print(word[2]) # "t"
print(word[5]) # "n"
print(word[-1]) # "n" (最後の文字)
print(word[-2]) # "o" (最後から2番目)-1 は常に最後の文字、-2 は最後から2番目、というように続きます。文字列の正確な長さを知らなくても末尾を取得したいときに便利です。
スライスは塊を抽出します。[start:stop] は start を含み、stop を除外します:
word = "Python"
print(word[0:2]) # "Py" (位置 0 と 1)
print(word[2:]) # "thon" (位置 2 から末尾まで)
print(word[:3]) # "Pyt" (先頭から位置 2 まで)
print(word[:]) # "Python" (文字列全体のコピー)
print(word[::2]) # "Pto" (1つおきの文字)
print(word[::-1]) # "nohtyP" (逆順)よく使う3つのパターン: 最初のn文字には word[:n]、位置n以降には word[n:]、最後のn文字には word[-n:]。word[::-1] は文字列を反転します。最初は奇妙に見えますが、Python の慣用句であり、よく目にすることになります。
必須の文字列メソッド
文字列には組み込みのメソッドが用意されています: 任意の文字列値に対して直接呼び出せる操作です。文字列(またはそれを保持する変数)を書き、ドット、そしてメソッド名を続けます。各メソッドは新しい文字列を返します。元の文字列は決して変更されません。
大文字・小文字
text = "Hello, World"
text.lower() # "hello, world"
text.upper() # "HELLO, WORLD"
text.title() # "Hello, World" (各単語を大文字化)
text.capitalize() # "Hello, world" (最初の単語のみ)lower() と upper() が最もよく使う2つです。lower() はテキストを比較するときに特に便利です: "Alice" と "alice" は両方に .lower() を呼び出すと同じものになります。
空白
text = " hello "
text.strip() # "hello" (両側)
text.lstrip() # "hello " (左のみ)
text.rstrip() # " hello" (右のみ)strip() は文字列の両端からスペースを削除します。ユーザー入力やファイルからのテキストを扱うときには必ずと言っていいほど使うでしょう。なぜなら、余分なスペースは静かな失敗を引き起こすからです: "alice" != "alice "。
検索
text = "Hello, world"
text.find("world") # 7
text.find("Python") # -1 (見つからない)
text.count("l") # 3
text.startswith("Hello") # True
text.endswith("world") # Truefind() はテキストの一片が文字列内のどこから始まるかという位置を返します。見つからなければ -1 を返します。文字列が何かで始まるか終わるかだけ気にしたいときには startswith() と endswith() を使います。
置換
text = "Hello, world"
text.replace("world", "Python") # "Hello, Python"
text.replace("l", "L") # "HeLLo, worLd" (すべての出現箇所)
text.replace("l", "L", 1) # "HeLlo, world" (最初のみ)replace() はテキストのすべての出現箇所を別のものに置き換え、新しい文字列を返します。元のものは変更されません。最初の出現だけを置換したい場合は第3引数を渡します。
分割と結合
split() は文字列を区切り文字で複数の部分に切り分け、リストとして返します。何で切るかを指定します:
csv_row = "タロウ,28,東京"
parts = csv_row.split(",") # ["タロウ", "28", "東京"]
" hello world ".split() # ["hello", "world"]リストとは?
リストは値の順序付きコレクションです。上の ["タロウ", "28", "東京"] がそれです。リストには独自の章がありますが、今のところは split() が生成し join() が消費する項目のシーケンスとして扱ってください。
join() はその逆を行います: 文字列のリストを1つに結合します。.join() の前の文字列が各項目の間に置かれます:
words = ["Hello", "world"]
" ".join(words) # "Hello world"
", ".join(words) # "Hello, world"
"".join(words) # "Helloworld"覚えるべきパターン: separator.join(list_of_strings)。区切り文字は左、リストは右です。" ".join(words) は各単語の間にスペースを入れます。"".join(words) は何もなしでくっつけます。
f-string
f-stringはテキストの中に直接値を埋め込みます。開きクオートの前に f を付けて、変数や式を波括弧で囲みます。コードが実行されるときにPythonが埋め込みます。値の後ろにコロンを付けて、表示の仕方を制御することもできます。
name = "タロウ"
score = 94.5
print(f"Hello, {name}!") # "Hello, タロウ!"
print(f"Score: {score:.1f}%") # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}") # "2 + 2 = 4"
print(f"Name: {name.upper()}") # "Name: タロウ": の後のフォーマットスペックは値の表示方法を制御します:
| スペック | 意味 | 例 |
|---|---|---|
.2f | 小数点以下2桁 | f"{3.14159:.2f}" → "3.14" |
.0% | パーセンテージ、小数なし | f"{0.94:.0%}" → "94%" |
, | 桁区切り | f"{1000000:,}" → "1,000,000" |
>10 | 10文字幅で右寄せ | f"{'hi':>10}" → " hi" |
最もよく使うのは .2f です: 長い桁数ではなくきれいな数字を表示したいときはいつでも。表内の他のものは必要なときに使えます。{} 内には任意の変数、算術、メソッド呼び出しを入れることができます。
複数行文字列
複数行にわたる文字列を書くには、三重引用符を使います: 始まりに " を3つ、終わりに3つです。Pythonは書いたとおりにすべての改行と空白を保持します。
message = """
タロウ様、
ご注文ありがとうございます。
敬具、
チーム一同
"""エスケープシーケンス
一部の文字は文字列内で直接タイプするのが難しいです。Pythonはエスケープシーケンスを使います: 何かを表す文字が続くバックスラッシュです。常に使う2つは、改行のための \n とタブのための \t です。
| シーケンス | 文字 |
|---|---|
\n | 改行 |
\t | タブ |
\\ | リテラルなバックスラッシュ |
\" | ダブルクオート |
\' | シングルクオート |
print("Line one\nLine two") # 出力は2行
print("Name:\tAlice") # Name: Alice
path = r"C:\Users\Alice\Documents" # 生文字列、エスケープ処理なし文字列内容のチェック
Pythonには文字列の内容についてyes/noの質問に答えるメソッドがあります。True か False を返します。早い段階で最も有用なもの: isdigit() を使うと、文字列が全部数字かどうか変換前にチェックでき、予期しない入力でのクラッシュを避けられます。
"42".isdigit() # True
"hello".isalpha() # True
"hello42".isalnum() # True
" ".isspace() # True
"Hello".islower() # False
"HELLO".isupper() # True実践例
空白を取り除き、ケースを正規化し、必要なものを取り出す。このシーケンスはほとんどあらゆるユーザー提供のテキストを処理します:
raw_input = " [email protected] "
email = raw_input.strip().lower() # "[email protected]"
at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]
print(f"User: {username}") # "taro"
print(f"Domain: {domain}") # "example.com"メソッドリファレンス
| メソッド | 動作 |
|---|---|
.lower() / .upper() | すべて小文字 / すべて大文字に変換 |
.title() / .capitalize() | 各単語を大文字化 / 最初のみ |
.strip() / .lstrip() / .rstrip() | 周囲の空白を削除 |
.find(sub) | 最初のマッチのインデックス、または -1 |
.count(sub) | sub が現れる回数 |
.startswith(s) / .endswith(s) | プレフィックス / サフィックスのチェック |
.replace(old, new) | 出現箇所を置換 |
.split(sep) | リストに分割 |
sep.join(iterable) | 項目を文字列に結合 |
.isdigit() / .isalpha() / .isalnum() | 文字種別チェック |

