Python 入門

Python 文字列

文字列はテキストを表現するために使用され、その処理能力はデータクレンジング、自然言語処理(NLP)、ユーザーインターフェース(UI)開発などのタスクで頻繁に活用されます。

本章では、文字列処理の3大コア技術である、結合 (Concatenation)(複数の文字列を組み合わせる)、スライス (Slicing)(文字列の特定部分を抽出する)、および フォーマット (Formatting)(動的なコンテンツを含む文字列を作成する)について詳しく解説します。

1. 文字列結合

文字列結合とは、2つ以上の文字列を合体させて1つの長い文字列にするプロセスのことです。Pythonでは、主に + 演算子を使用してこれを行います。

1.1 + 演算子の使用

+ 演算子は、文字列を結合する最も直感的な方法です。

# 例 1:基本的な結合
string1 = "Hello"
string2 = "World"
result = string1 + " " + string2  # 間にスペースを挿入
print(result)  # 出力: Hello World

# 例 2:異なるデータ型の変数を結合(型変換が必要)
name = "Alice"
age = 30

# 以下の行をそのまま実行するとエラーになります:TypeError: can only concatenate str (not "int") to str
# message = "My name is " + name + " and I am " + age 

message = "My name is " + name + " and I am " + str(age) # str() を使って整数を文字列に変換
print(message)  # 出力: My name is Alice and I am 30

コード解析:
例1では、2つの文字列変数と1つのスペースリテラルを結合し、完全な文章を作成しています。
例2では、型変換 (Type Conversion) の重要性を示しています。Pythonは結合時に数値を自動的に文字列へ変換しません。必ず str() 関数を使用して、整数である age を明示的に文字列に変換してから結合する必要があります。

1.2 += 演算子の使用

+= 演算子は、既存の文字列の末尾に新しいテキストを追加するための簡略化された書き方を提供します。

# 例:既存の文字列にコンテンツを追加
greeting = "Hello"
greeting += " "      # スペースを追加
greeting += "there!" # "there!" を追加
print(greeting)      # 出力: Hello there!

コード解析:+= 演算子は、元の文字列変数を直接修正します。これは、+ 演算子を使用して再代入する(greeting = greeting + " ")よりも簡潔で読みやすい書き方です。

1.3 join() メソッドによる効率的な結合

大量の文字列を結合する場合(特にリストなどのイテラブルオブジェクトに格納されている場合)、join() メソッドを使用するのがエレガントであり、かつ実行効率(パフォーマンス)も非常に優れています。

# 例:join() を使って文字列リストを結合
words = ["This", "is", "a", "sentence."]
sentence = " ".join(words)  # スペースを区切り文字(デリミタ)としてリストの単語を連結
print(sentence)  # 出力: This is a sentence.

# 例:空文字列を区切り文字として使用
characters = ['P', 'y', 't', 'h', 'o', 'n']
word = "".join(characters)
print(word) # 出力: Python

コード解析:join() メソッドは、区切り文字 (Separator) となる文字列から呼び出され、引数としてイテラブルオブジェクト(リストなど)を受け取ります。各要素の間にその区切り文字を挿入しながら結合します。
最初の例では " "(スペース)を使って単語リストを一文にまとめ、2番目の例では ""(空文字列)を使って文字リストを一つの単語として隙間なく組み合わせています。

2. 文字列スライス (String Slicing)

文字列スライスを使用すると、インデックス(位置)の範囲を指定することで、文字列の一部を正確に抽出できます。

2.1 スライスの基本構文

文字列スライスの基本構文は string[start:end:step] です。

  • start (開始位置):スライスを開始するインデックス(この位置の文字を含む)。省略した場合はデフォルトで 0(先頭)になります。
  • end (終了位置):スライスを終了するインデックス(この位置の文字は含まない)。省略した場合はデフォルトで文字列の長さ(末尾まで)になります。
  • step (ステップ):文字を抽出する際の間隔。省略した場合はデフォルトで 1(一つずつ)になります。
text = "Python is fun!"

# 例 1:開始と終了のインデックスを指定
substring = text[0:6]  # インデックス 0 から 6 の手前まで抽出
print(substring)       # 出力: Python

# 例 2:開始インデックスのみ指定
substring = text[7:]   # インデックス 7 から末尾まで全抽出
print(substring)       # 出力: is fun!

# 例 3:終了インデックスのみ指定
substring = text[:6]   # 先頭からインデックス 6 の手前まで全抽出
print(substring)       # 出力: Python

# 例 4:ステップ (step) の使用
substring = text[0:13:2] # インデックス 0 から 12 の間で、2文字おきに抽出
print(substring)         # 出力: Pto sfn

# 例 5:負のステップを使用(文字列を反転させる裏技)
reversed_text = text[::-1]  # 文字列全体を反転
print(reversed_text)        # 出力: !nuf si nohtyP

2.2 負のインデックス (Negative Indices)

Pythonは負のインデックスもサポートしており、文字列の末尾から逆算して指定することができます。

  • -1 は最後の文字を表します。
  • -2 は最後から2番目の文字を表し、以下同様に続きます。
text = "Python"

# 例:負のインデックスで単一文字にアクセス
last_character = text[-1]  # 最後の文字
print(last_character)      # 出力: n

second_last = text[-2]     # 最後から2番目の文字
print(second_last)         # 出力: o

# 例:スライスと負のインデックスの組み合わせ
substring = text[-3:]      # 最後の3文字を抽出(後ろから3番目から末尾まで)
print(substring)           # 出力: hon

substring = text[:-3]      # 最後の3文字を除いたすべてを抽出
print(substring)           # 出力: Pyt

3. 文字列フォーマット

文字列フォーマットとは、変数の値を文字列内の 占位符 (Placeholder) に動的に埋め込むプロセスのことです。Pythonにはいくつかの方法がありますが、現在最もモダンで推奨されているのが f-strings です。

3.1 f-strings (フォーマット済み文字列リテラル)

f-strings は、文字列内に式を埋め込むための非常に簡潔で読みやすい方法を提供します。文字列の開始引用符の前に f または F を付けるだけです。

# 例 1:基本的な f-string フォーマット
name = "Bob"
age = 40
message = f"My name is {name} and I am {age} years old."
print(message)  # 出力: My name is Bob and I am 40 years old.

# 例 2:f-string 内で直接計算を実行
x = 10
y = 5
result = f"The sum of {x} and {y} is {x + y}."
print(result)  # 出力: The sum of 10 and 5 is 15.

# 例 3:f-string で小数点以下の桁数を制限
pi = 3.14159265359
formatted_pi = f"The value of pi is approximately {pi:.2f}"  # 小数点第2位までに制限
print(formatted_pi)  # 出力: The value of pi is approximately 3.14

3.2 書式指定子

{} 内に書式指定子を追加することで、変数の表示形式を精密に制御できます。よく使われる指定子は以下の通りです。

  • .nf:浮動小数点数を小数点以下 n 桁にフォーマット。
  • d:整数を10進数としてフォーマット(ゼロ埋めなどに活用)。
  • %:数値を100倍してパーセンテージ形式で表示。
  • >, <, ^:テキストの右揃え、左揃え、中央揃えを制御。
# 例 1:整数のフォーマット (ゼロ埋め)
number = 42
formatted_number = f"The number is {number:04d}"  # 全体で4桁になるよう前方をゼロで埋める
print(formatted_number)  # 出力: The number is 0042

# 例 2:パーセンテージのフォーマット
value = 0.75
formatted_percentage = f"The value is {value:.2%}"  # 小数点2桁までのパーセンテージ形式
print(formatted_percentage)  # 出力: The value is 75.00%

# 例 3:テキストの配置
text = "Hello"
aligned_text = f"{text:>10}"  # 幅10のフィールド内で右揃え
print(aligned_text)  # 出力:      Hello

3.3 .format() メソッド (従来の書き方)

f-strings が推奨されますが、古いコードベースでは .format() メソッドも頻繁に目にします。機能は似ていますが、構文が若干異なります。

# 例 1:.format() を使った基本的なフォーマット
name = "Charlie"
age = 35
message = "My name is {} and I am {} years old.".format(name, age)
print(message)  # 出力: My name is Charlie and I am 35 years old.

# 例 2:インデックス(位置番号)によるフォーマット
message = "My name is {1} and I am {0} years old.".format(age, name)
print(message)  # 出力: My name is Charlie and I am 35 years old.

# 例 3:キーワード引数によるフォーマット
message = "My name is {name} and I am {age} years old.".format(name="David", age=28)
print(message)  # 出力: My name is David and I am 28 years old.