【Python】文字列型(str)の操作を徹底解説(練習問題あり)

Pythonにおけるstr(文字列型)の基本操作について、RPGの世界観を交えながら入門者向けに解説します。

「文字列型」とは

「文字列型(str型)」は、文字や記号、数字などを文字列として扱うためのデータ型です。
Pythonでは、変数に代入する値を "(ダブルクォーテーション) または '(シングルクォーテーション) で囲むと、自動的に文字列型になります。

# 主人公の情報を登録
character_name = "兎野ぴこり"  # キャラクター名(ダブルクォーテーションの場合)
occupation = '勇者'           # 職業(シングルクォーテーションの場合)

# 登録情報の表示
print("主人公の名前:", character_name)
print("職業:", occupation)

# データ型の表示
print(type(character_name))
print(type(occupation))
主人公の名前: 兎野ぴこり
職業: 勇者
<class ‘str’>
<class ‘str’>

上記の例では、"兎野ぴこり"'勇者' はどちらも同じ文字列型として扱われます。 つまり、ダブルクォーテーションとシングルクォーテーションに機能的な違いはありません

「”兎野ぴこり”」や「’勇者’」のように、クォーテーションで囲まれた文字列のことを「文字列リテラル」といいます。リテラルは、プログラムの中に「そのまま直接書かれた値」のことです。文字列リテラルは、リテラルの中でも「文字列をそのまま書いたもの」です。

同じクォーテーションを文字列内に含めたい場合は、エスケープ文字(\を使います。

# NPCとの会話ログ
quote = '村人A: \'魔王が近くまで来ている…\''
dialogue = "勇者ぴこり: \"心配するな、必ず守るぴこ!\""

# 会話ログの表示
print(quote)
print(dialogue)
村人A: ‘魔王が近くまで来ている…’
勇者ぴこり: “心配するな、必ず守るぴこ!”
文字列の中で特別な意味を持つ記号(例:クォーテーション、改行、タブなど)をそのまま文字として使いたいときに、エスケープ文字(\を使います。 このバックスラッシュを使った記法をエスケープシーケンスと呼びます。
主なエスケープシーケンス 意味
\' シングルクォーテーションを文字として表示
\" ダブルクォーテーションを文字として表示
\\ バックスラッシュ自体を表示

外側と内側でクォーテーションの種類を変えると、エスケープ文字(\を使う必要がありません。

# NPCとの会話ログ
quote = "村人A: '魔王が近くまで来ている…'"
dialogue = '勇者ぴこり: "心配するな、必ず守るぴこ!"'

# 会話ログの表示
print(quote)
print(dialogue)
村人A: ‘魔王が近くまで来ている…’
勇者ぴこり: “心配するな、必ず守るぴこ!”

どちらのクォーテーションを使うべき?

繰り返しになりますが、Pythonではシングルクォーテーション('...')とダブルクォーテーション("...")に機能的な違いはありません。 どちらを使っても同じ「文字列型(str)」として扱われます。よって、個人開発なら「どちらかに決めて統一する」、チーム開発なら「チームで統一する」のが基本です。

Python公式のコーディング規約「PEP 8」では、シングルクォーテーション(’…’)とダブルクォーテーション(”…”)のどちらを使っても構わないとされています。重要なのは「一貫性」で、同じプロジェクトやモジュール内ではスタイルを統一することが推奨されています。

文字列の連結① + 演算子

Pythonでは、+ 演算子を使って文字列を連結できます。
文章や名前、メッセージをつなげて新しい文字列を作るときに便利です。

文字列リテラル同士の連結

# キャラクター名前と職業名を結合
hero_name = "勇者"  + "兎野ぴこり"

# 結果を表示
print(hero_name)
勇者兎野ぴこり

変数同士の連結

character_name = "兎野ぴこり"  # キャラクター名
occupation = "勇者"            # 職業名

# キャラクター名前と職業名を結合
hero_name = occupation  + character_name

# 結果を表示
print(hero_name)
勇者兎野ぴこり

変数と文字列リテラルの連結

character_name = "兎野ぴこり"  # キャラクター名

# キャラクター名前と職業名を結合
hero_name = "勇者"  + character_name

# 結果を表示
print(hero_name)
勇者兎野ぴこり
【Python】文字列の連結
この記事では、Python言語でリスト(配列)に要素を追加する方法をソースコード付きで解説します。

文字列の連結② f文字列

f文字列(フォーマット済み文字列リテラル)とは、Python 3.6以降で使える、変数や式を文字列の中に直接埋め込む方法です。 文字列の前に f または F を付け、{}(波かっこ)の中に変数名や計算式を書きます。

■基本の書式

f"文字列 {変数や式} 文字列"
  • f → 「この文字列の中に変数や式を埋め込みます」という合図
  • {} → 中に変数名や計算式を書く場所
  • 変数や式は自動的に文字列に変換されて埋め込まれます

以下のコードは、f文字列を使って、文字列型と整数型の変数の値を連結して、1つの文字列を作る例です。(数値は自動で文字列に変換されます)

# 勇者ぴこりのステータス
name = "ぴこり"
level = 5
gold = 120

# f文字列で表示
message = f"勇者{name}(Lv{level})は {gold} ゴールドを持っている"
print(message)
勇者ぴこり(Lv5)は 120 ゴールドを持っている

以下のコードは、f文字列内で整数型の変数の計算を行ってから、1つの文字列を作る例です。

# 戦闘後のゴールド計算
gold = 120
reward = 80

print(f"戦闘後の所持金は {gold + reward} ゴールドになった")
戦闘後の所持金は 200 ゴールドになった

f文字列を使うと、str()関数を使わなくても、整数型や浮動小数点型は自動的に文字列型へ変換することができます。そのため、文字列型や数値型の変数を複数連結する場合、演算子+を使うよりもf文字列のほうがスッキリして読みやすくなり、よく使われます。

文字列の連結③ join()メソッド

join() メソッドは、リストなどの複数の文字列を「ひとつの文字列」にまとめることができます。使い方は、以下コードのように、「つなぎ文字列.join(リスト)」という順番で使います。

# 勇者ぴこりのアイテム袋
pouch  = ["剣", "弓", "やくそう"]

# 「-」で名前をつなげて表示
print("-".join(pouch))
剣-弓-やくそう

リストの中身が文字列でないとエラーになるので注意しましょう。

リストは、複数の値をひとまとめにして管理できるデータの入れ物です。[値1, 値2, 値3, …] のように、各値をカンマで区切って角括弧 [] で囲うように書きます。RPGで例えるなら、勇者ぴこりの「アイテム収納袋」のようなものです。袋の中には「剣」や「弓」、「やくそう」など複数のアイテムが入ります。1つ1つの値は「要素」と呼び、順番(インデックス番号)で取り出せます。リスト形式のデータ型のことを「リスト型」といいます。リスト型に関する詳しい解説は「【Python】リスト型の使い方」をご参照ください。

文字列の長さを調べる

len() 関数は、文字列の「長さ(文字数)」を調べることができます。キャラクター名の「文字数制限チェック」や、メッセージの「表示幅調整」などに使えます。

# 主人公の名前
name = "ぴこり"

# 名前の文字数を調べる
print(len(name))  # 出力:3
3
日本語の文字列でも、1文字ずつカウントされます。絵文字や特殊文字は環境によって異なる扱いになることもあるので注意しましょう。

文字列の置換

文字列の一部を別の文字列に置き換えるには、replace というメソッドを使います。メソッドを使う場合、基本的には以下のように書きます。

変数名.メソッド名(第一引数, 第二引数, ...)

replace メソッドの第1引数には「置き換えたい文字列」、第2引数に「新しい文字列」を指定します。

メソッドは「そのデータが持っている専用の道具」や「必殺技」のようなものです。文字列(str型)には、文字を探したり、置き換えたり、形を変えたりするための道具がいくつも用意されています。 replace メソッドはその中の1つで、「文字を置き換える」ための道具です。引数(ひきすう)は、その道具(関数・メソッドなど)に渡す「材料」や「指示書」です。 メソッドに関するちゃんとした説明は、オブジェクト指向の解説ページをご確認ください。

replace メソッドの使い方を理解するために以下のコードを見てみましょう。

# ゲーム進捗ログ
log = "勇者ぴこりは宝箱を開けた。なんと、ゴールドを手に入れた。"

# ログの一部を置き換える
# replace(置き換えたい文字列, 新しい文字列)
log = log.replace("ゴールドを手に入れた", "宝箱はモンスターだった")

print(log)
勇者ぴこりは宝箱を開けた。なんと、宝箱はモンスターだった。

logという文字列型の変数の「replace」という道具(メソッド)を使って、「ゴールドを手に入れた」を「宝箱はモンスターだった」に置き換えています。(ちょっと可哀そう…)

【Python】文字列の置換(replace関数)
この記事では、Pythonでで文字列を置換する方法をソースコード付きで解説します。

文字列の検索と判定

Pythonでは、文字列の中に特定の文字列が含まれているかを調べたり、特定の文字列で始まっているか・終わっているかを判定するために、次のメソッドを使います。

メソッド 説明
find() 指定した文字列が最初に現れる位置(インデックス番号)を返す。見つからない場合は -1
index() find() と同様だが、見つからない場合はエラーを返す。
startswith() 指定した文字列で始まっているかを判定。True または False を返す。
endswith() 指定した文字列で終わっているかを判定。True または False を返す。

上記メソッドの使い方を理解するために以下のコードを見てみましょう。

#  冒険日誌
log = "5日目:ぴこりは暗黒の森に足を踏み入れた"

# 文字列の位置を探す(find)
# 「暗黒」が最初に出てくる位置(インデックス番号)を返す
print(log.find("暗黒"))  # 出力:8

# indexはfindと同じだが、見つからないとエラーになる
print(log.index("森"))   # 出力例:11

# 日誌が特定の文字列で始まっているか(startswith)
print(log.startswith("5日目"))  # 出力:True

# 日誌が特定の文字列で終わっているか(endswith)
print(log.endswith("踏み入れた"))  # 出力:True
8
11
True
True
True(トゥルー)は、Pythonで使われる論理型(bool型)の値の1つです。 論理型(bool型)には、True(トゥルー)とFalse(フォールス)の2種類の値しかありません。

① True(真)=「はい」「正しい」「そうだ」という肯定を表す
② False(偽)=「いいえ」「間違い」「そうではない」という否定を表す

論理型は、条件が正しいかどうかを判定するときに使います。今回だと、「日誌が”5日目”という文字列で始まっている」「日誌が”踏み入れた”という文字列で終わっている」ので、実行結果にはTrueが2つ並んでいます。

【Python】文字列の検索(find、index、startswith、endswidth関数)
この記事では、Pythonで文字列を検索する方法をソースコード付きで解説します。

数値型と文字列型の相互変換

Pythonでは、整数型(int型)、浮動小数点型(float型)、文字列型(str型)の値を、str()int()float()といった関数で相互に変換できます。計算や表示を組み合わせるときによく使います。

関数 説明
str() 「整数型」もしくは「浮動小数点型」を「文字列型」に変換します。
int() 「文字列型」もしくは「浮動小数点型」を整数型(小数がない数値)に変換します。小数を含む文字列をint()関数に渡すとエラーになります。
float() 浮動小数点型(小数を含む数値)に変換します。

以下のコードは、str() 関数で数値型(整数型)を文字列型に変換する例です。

# 勇者ぴこりの所持金(整数型)
gold = 100

# 数値を文字列に変換
gold_text = str(gold)

# 文字列として表示(2つの文字列リテラルと1つの文字列型の変数を結合)
message = "ぴこりの所持金:" + gold_text + "ゴールド"

print(message)
ぴこりの所持金:100ゴールド

以下のコードは、int()関数で文字列型を整数型に変換して計算する例です。

# 宝箱の中身(文字列)
treasure_gold = "100"
bonus = 50

# 文字列を整数に変換して計算
total_gold = int(treasure_gold) + bonus
print(total_gold)  # 出力結果:150
150

以下のコードは、float()関数で文字列型を浮動小数点型に変換して計算する例です。

# 回復ポーションの効果(文字列)
potion_heal = "1.5"
base_hp = 100

# 文字列を小数に変換して計算
new_hp = base_hp + float(potion_heal)
print(new_hp)  # 出力結果:101.5
101.5
【Python】文字列を数値に変換(int, float関数)
この記事では、Pythonで字列を数値に変換する方法をソースコード付きで解説します。

大文字・小文字の変換

Pythonでは、文字列のすべての文字を大文字または小文字に変換するためのメソッドがあります。UIやログ整形などに使われます。

メソッド 説明
upper() 文字列をすべて大文字に変換
lower() 文字列をすべて小文字に変換

以下のコードは、上記の関数を用いて大文字または小文字に変換する例です。

# 冒険日誌
log = "ぴこり enters the Dark Forest"

# 大文字化
print(log.upper())
# 出力:ぴこり ENTERS THE DARK FOREST

# 小文字化
print(log.lower())
# 出力:ぴこり enters the dark forest
ぴこり ENTERS THE DARK FOREST
ぴこり enters the dark forest

日本語部分は大文字・小文字の区別がないため変化せず、英語部分だけが upper() / lower() の影響を受けます。
他にも、capitalize()(先頭だけ大文字)やtitle()(単語ごとに先頭大文字)などの便利な関数があります。

【Python】文字列の大文字・小文字変換(lower、upper関数)
この記事では、Pythonで文字列を大文字・小文字変換する方法をソースコード付きで解説します。

文字列の分割

文字列を分割するには、split() メソッドを使います。 split()引数に「区切り文字(区切るための印)」を指定すると、その印ごとに文字列が切り分けられ、リスト型で返ってきます。引数を省略すると、空白文字(スペースや改行)で分割されます。

# 冒険日誌(カンマ区切り)
log = "剣,盾,回復薬"
items = log.split(",")  # カンマで分割
print(items)
[‘剣’, ‘盾’, ‘回復薬’]
# 冒険日誌(スペース区切り)
log = "ぴこり は 暗黒の森 に 入った"
words = log.split()  # スペースで分割(引数なし)
print(words)
[‘ぴこり’, ‘は’, ‘暗黒の森’, ‘に’, ‘入った’]
【Python】splitで文字列の分割
Python3のsplitメソッドで文字列を分割する方法をソースコード付きで解説します。

文字列の部分削除

文字列の先頭にある不要な文字を削除するには、lstrip() メソッドを使います。引数には、削除したい「不要な文字」を指定します。引数がない場合、先頭の空白(スペースやタブ)を削除します。

メソッド 処理対象 引数なしの場合 引数ありの場合
lstrip() 左側(先頭) 先頭の空白を削除 先頭から、指定した文字が連続している限り削除
rstrip() 右側(末尾) 末尾の空白を削除 末尾から、指定した文字が連続している限り削除
strip() 両端 両端の空白を削除 両端から、指定した文字が連続している限り削除

① 以下のコードは、先頭の空白を削除する例です。

# 冒険日誌(先頭に空白あり)
log = "     ぴこりは村に到着した"
print(log.lstrip())
ぴこりは村に到着した

②以下のコードは、先頭の特定の文字をする例です。

# 特定の文字を削除(先頭の「ぴ」「こ」「ら」を削除)
log = "ぴこりは村に到着した"
print(log.lstrip("ぴこり"))
は村に到着した

③以下のコードは、rstrip()strip()の使用例です。

log = "   ★ぴこりは村に到着した★   "
print(log.lstrip())       # 左端の空白削除
# 出力:"★ぴこりは村に到着した★   "

print(log.rstrip())       # 右端の空白削除
# 出力:"   ★ぴこりは村に到着した★"

print(log.strip())        # 両端の空白削除
# 出力:"★ぴこりは村に到着した★"

print(log.strip(" ★"))    # 両端の空白と★を削除
# 出力:"ぴこりは村に到着した"
【Python】文字列の先頭・末尾・空白削除(lstrip、rstrip関数)
この記事では、Pythonで文字列の先頭・末尾・空白を削除する方法をソースコード付きで解説します。

練習問題(基礎固め & 資格勉強用)

本ページで学んだ内容の基礎を固めるため、また「Python 3 エンジニア認定基礎試験」や「基本情報技術者試験」など、Python関連のIT資格の取得を目指す方に向けて、練習問題を作成しました。

【問題1】文字列の長さを求める

以下のコードを実行したときの出力は?

name = "ぴこり"
print(len(name))

A. 3
B. 4
C. “ぴこり”
D. エラーになる


正解:A
解説:`len()` は文字列の長さを返します。「ぴ」「こ」「り」で3文字です。

【問題2】大文字変換

以下のコードを実行したときの出力は?

log = "pikori enters the dark forest"
print(log.upper())

A. pikori enters the dark forest
B. PIKORI ENTERS THE DARK FOREST
C. Pikori Enters The Dark Forest
D. エラーになる


正解:B
解説:`upper()` は英字をすべて大文字に変換します。日本語部分は変化しません。

【問題3】小文字変換

以下のコードを実行したときの出力は?

log = "PIKORI Enters The Dark Forest"
print(log.lower())

A. pikori enters the dark forest
B. PIKORI ENTERS THE DARK FOREST
C. Pikori Enters The Dark Forest
D. エラーになる


正解:A
解説:`lower()` は英字をすべて小文字に変換します。

【問題4】文字列の置換

以下のコードを実行したときの出力は?

log = "ぴこりはスライムを倒した"
print(log.replace("スライム", "ドラゴン"))

A. ぴこりはスライムを倒した
B. ぴこりはドラゴンを倒した
C. ドラゴンはぴこりを倒した
D. エラーになる


正解:B
解説:`replace(置換前, 置換後)` は一致部分を別の文字列に置き換えます。

【問題5】文字列の分割

以下のコードを実行したときの出力は?

items = "剣,盾,回復薬"
print(items.split(","))

A. “剣 盾 回復薬”
B. [‘剣’, ‘盾’, ‘回復薬’]
C. 剣,盾,回復薬
D. エラーになる


正解:B
解説:`split(“,”)` はカンマで区切り、リストとして返します。

【問題6】文字列の結合

以下のコードを実行したときの出力は?

party = ['ぴこり', 'みより', 'あくび']
print("-".join(party))

A. ぴこり みより あくび
B. ぴこり-みより-あくび
C. [‘ぴこり’, ‘みより’, ‘あくび’]
D. エラーになる


正解:B
解説:`join()` はリストの要素を指定した文字列で連結します。

【問題7】前方一致判定

以下のコードを実行したときの出力は?

log = "Day 1: ぴこりは村を出発した"
print(log.startswith("Day 1"))

A. True
B. False
C. Day 1
D. エラーになる


正解:A
解説:`startswith()` は文字列が指定文字列で始まっているかを判定し、始まっていればTrue、始まっていなければFalseを返します。

【問題8】後方一致判定

以下のコードを実行したときの出力は?

log = "ぴこりは銀の村に到着した"
print(log.endswith("到着した"))

A. True
B. False
C. 到着した
D. エラーになる


正解:A
解説:`endswith()` は文字列が指定文字列で終わっているかを判定し、始まっていればTrue、始まっていなければFalseを返します。

【問題9】空白除去

以下のコードを実行したときの出力は?

log = "   ぴこりは洞窟に入った   "
print(log.strip())

A. “ぴこりは洞窟に入った”
B. ” ぴこりは洞窟に入った”
C. “ぴこりは洞窟に入った “
D. エラーになる


正解:A
解説:`strip()` は文字列の両端にある空白や指定文字を削除します。

【問題10】f文字列

以下のコードを実行したときの出力は?

name = "ぴこり"
level = 7
print(f"勇者{name}のレベルは{level}です")

A. 勇者ぴこりのレベルは7です
B. 勇者{name}のレベルは{level}です
C. 勇者ぴこりのレベルはlevelです
D. エラーになる


正解:A
解説:f文字列は `f”…”` の中に `{変数}` を書くと、その値が埋め込まれます。

課題(実践力強化用)

Pythonプログラミングの実践力を強化したい人向けの課題を用意しました。仕様通りに動くプログラムを書いたりエラーメッセージを読んでコードを修正するという作業は、プログラミングおいて重要ですので、初心者の方は是非チャレンジしてみてください。

課題① コード作成

以下の仕様を満たすPythonコードを1から書いてください。

  • 主人公「ぴこり」の名前の文字数を調べて表示する
  • 出力は「名前の文字数:3」となるようにする
名前の文字数:3

name = "ぴこり"
print("名前の文字数:" + str(len(name)))

`len()`関数は文字列の長さ(文字数)を返します。数値を文字列に変換するために `str()` を使っています。

課題② コード修正

以下のコードを実行するとエラーになります。正しく修正して、パーティー名を「ぴこり-みより-あくび」と表示してください。

party = ["ぴこり", "みより", "あくび"]
print(party.join("-"))

■エラー内容:`AttributeError: ‘list’ object has no attribute ‘join’`

`join()`は「つなぎ文字列.join(リスト)」の形で使います。リスト側ではなく、文字列側から呼び出す必要があります。

■修正後のコード:

party = ["ぴこり", "みより", "あくび"]
print("-".join(party))

課題③ コード作成

以下の仕様を満たすコードを書いてください。

  • 文字列 "ぴこりは石の村に到着した""銀の村" に置き換えて表示する
  • 出力は「ぴこりは銀の村に到着した」となること
ぴこりは銀の村に到着した

log = "ぴこりは石の村に到着した"
print(log.replace("石の村", "銀の村"))

`replace()`メソッドは、指定した文字列を別の文字列に置き換えます。

課題④ コード修正

以下のコードは、アイテムをカンマで分割しようとしていますが、出力が期待通りになりません。正しく修正して、リスト形式で表示してください。

items = "剣|盾|回復薬"
print(items.split(","))

■出力結果:`[‘剣|盾|回復薬’]`(分割されていない)

■原因:区切り文字が `”|”` なのに、`split(“,”)` でカンマを指定しているため

■修正後のコード:

items = "剣|盾|回復薬"
print(items.split("|"))

課題⑤ コード作成

以下の仕様を満たすコードを書いてください。

  • 文字列 "Day 1: ぴこりは村を出発した""Day 1" で始まっているか判定する
  • 出力は True になること
True

log = "Day 1: ぴこりは村を出発した"
print(log.startswith("Day 1"))

`startswith()`は、文字列が指定した語句で始まっているかどうかを判定し、`True` または `False` を返します。

関連ページ(もっと学びたい人へ)

Pythonの基礎から応用例まで、以下ページから学ぶことができます。

【Python超入門】基礎から応用例まで幅広く解説
Pythonの使い方について、基礎文法から応用例まで入門者向けに解説します。
この記事を書いた人
西住技研

プログラミング言語「Python」を研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
筆者の詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
Python基礎

コメント

  1. y0ma10n0de5k0 より:

    文字列検索の部分に関する質問、失礼します。
    find, index, startswith endwith それぞれ ) が足りないと思うのですが、いかがでしょうか。
    読みやすくて学びやすいので重宝しています。
    ありがとうございます。

    • 管理人 より:

      ※y0ma10n0de5k0様
      コメントありがとうございます。
      ご指摘いただいたとおり、)が抜けておりましたので修正いたしました。
      こちらこそ、ご指摘&応援メッセージをいただきありがとうございます。

  2. タッキー より:

    確認お願いします

    int関数やfloat関数で次のように数値を文字列に変換すると、数値同士の足し算・・・

  3. タッキー より:

    確認お願いします

    【正規表現】reモジュール
    パターン式「|」 、内容「前後にある正規表現のいずれかと一致」