文字列のメソッド:大文字小文字変換や置換#

はじめに#

今回は、さらに文字列を効率的に操作するための「文字列メソッド」について学びましょう。

文字列メソッドは、文字列に対して特定の操作を行うための便利な機能です。文字を大文字や小文字に変換したり、特定の文字を置き換えたり、文字列内の特定の文字を検索したりといった様々な操作を簡単に行うことができます。

メソッドとは#

「メソッド」とはプログラミングにおいて、特定のデータ(この場合は文字列)に関連付けられた関数のことです。文字列メソッドは、文字列の後にドット(.)を付け、その後にメソッド名と括弧を書くことで呼び出します。

文字列.メソッド名()

例えば、以前学んだ文字列の長さを調べるlen()関数と異なり、メソッドは対象の文字列に直接紐づいています。

大文字・小文字変換のメソッド#

まずは、文字列の大文字・小文字を変換するメソッドから見ていきましょう。

>
# 大文字・小文字変換のメソッド
text = "Hello, Python!"

# すべて大文字に変換
upper_text = text.upper()
print(f"upper(): {upper_text}")

# すべて小文字に変換
lower_text = text.lower()
print(f"lower(): {lower_text}")

# 先頭の文字だけ大文字に、それ以外は小文字に変換
capitalize_text = text.capitalize()
print(f"capitalize(): {capitalize_text}")

text = "welcome to python"

# 各単語の先頭を大文字に変換
title_text = text.title()
print(f"title(): {title_text}")

実行結果:

upper(): HELLO, PYTHON!
lower(): hello, python!
capitalize(): Hello, python!
title(): Welcome To Python

これらのメソッドは、元の文字列を変更するのではなく、変換された新しい文字列を返します。

文字列の検索メソッド#

文字列内で特定の文字やパターンを検索するためのメソッドもあります。

>
# 文字列検索のメソッドの例
text = "Python programming is fun and practical"

# 特定の文字列が含まれるかチェック
contains_prog = "programming" in text
print(f"'programming' in text: {contains_prog}")
contains_java = "java" in text
print(f"'java' in text: {contains_java}")

# 特定の文字列で始まるかチェック
starts_with_py = text.startswith("Python")
print(f"startswith('Python'): {starts_with_py}")

# 特定の文字列で終わるかチェック
ends_with_al = text.endswith("practical")
print(f"endswith('practical'): {ends_with_al}")

# 部分文字列の位置を検索
position_is = text.find("is")
print(f"find('is'): {position_is}")  # 最初に現れる位置のインデックス

# 存在しない場合は -1 を返す
position_java = text.find("java")
print(f"find('java'): {position_java}")  # 存在しないので -1

# 右側から検索
position_a = text.rfind("a")
print(f"rfind('a'): {position_a}")  # 右側から検索して見つかった位置

実行結果:

'programming' in text: True
'java' in text: False
startswith('Python'): True
endswith('practical'): True
find('is'): 19
find('java'): -1
rfind('a'): 37

in演算子は厳密にはメソッドではありませんが、文字列内に特定の部分文字列が含まれるかをチェックするのに便利です。startswith()endswith()メソッドは、文字列が特定のパターンで始まるか終わるかをチェックします。find()rfind()メソッドは部分文字列の位置(インデックス)を返し、見つからない場合は-1を返します。find()は左から右に、rfind()は右から左に検索します。

文字列の置換メソッド#

文字列内の特定の部分を別の文字列に置き換えるメソッドもあります。

>
# 文字列置換のメソッド
text = "Python is easy and Python is powerful"

# 特定の部分文字列を置換
replaced_text = text.replace("Python", "プログラミング")
print(f"replace('Python', 'プログラミング'): {replaced_text}")

# 置換回数を指定
replaced_once = text.replace("Python", "プログラミング", 1)
print(f"replace('Python', 'プログラミング', 1): {replaced_once}")

実行結果:

replace('Python', 'プログラミング'): プログラミング is easy and プログラミング is powerful
replace('Python', 'プログラミング', 1): プログラミング is easy and Python is powerful

replace()メソッドは、第1引数で指定した部分文字列をすべて第2引数の文字列に置き換えます。第3引数で置換する最大回数を指定することもできます。

文字列の分割と結合#

文字列を特定の区切り文字で分割したり、複数の文字列を結合したりするメソッドもあります。

>
# 文字列の分割と結合
text = "apple,banana,orange,grape"

# カンマで分割してリストに
fruits_list = text.split(",")
print(f"split(','): {fruits_list}")

# スペースで分割
sentence = "This is a sample sentence"
words = sentence.split()  # 区切り文字を指定しない場合はスペースで分割
print(f"split(): {words}")

# 文字列の結合(前回学んだjoinメソッド)
fruits_text = " | ".join(fruits_list)
print(f"' | '.join(fruits_list): {fruits_text}")

実行結果:

split(','): ['apple', 'banana', 'orange', 'grape']
split(): ['This', 'is', 'a', 'sample', 'sentence']
' | '.join(fruits_list): apple | banana | orange | grape

split()メソッドは、指定した区切り文字で文字列を分割し、結果をリストとして返します。引数を指定しない場合はスペースで分割します。join()メソッドは、リストの要素を指定した区切り文字で連結します。

文字列の空白処理メソッド#

文字列の先頭や末尾の空白を削除するためのメソッドもあります。

>
# 空白処理メソッド
text = "   Hello, World!   "

# 先頭と末尾の空白を削除
stripped = text.strip()
print(f"strip(): '{stripped}'")

# 先頭の空白だけ削除
left_stripped = text.lstrip()
print(f"lstrip(): '{left_stripped}'")

# 末尾の空白だけ削除
right_stripped = text.rstrip()
print(f"rstrip(): '{right_stripped}'")

# 特定の文字を削除
text2 = "###Python###"
stripped2 = text2.strip("#")
print(f"strip('#'): '{stripped2}'")

実行結果:

strip(): 'Hello, World!'
lstrip(): 'Hello, World!   '
rstrip(): '   Hello, World!'
strip('#'): 'Python'

strip()メソッドは文字列の先頭と末尾から指定した文字(デフォルトは空白)を削除します。lstrip()は先頭のみ、rstrip()は末尾のみ削除します。

文字列の内容チェックメソッド#

文字列の内容を確認するための便利なメソッドもあります。

>
# 文字列の内容チェック
print(f"'123'.isdigit(): {'123'.isdigit()}")  # すべて数字か
print(f"'abc'.isalpha(): {'abc'.isalpha()}")  # すべてアルファベットか
print(f"'123abc'.isalnum(): {'123abc'.isalnum()}")  # 英数字のみか
print(f"'HELLO'.isupper(): {'HELLO'.isupper()}")  # すべて大文字か
print(f"'hello'.islower(): {'hello'.islower()}")  # すべて小文字か
print(f"'   '.isspace(): {'   '.isspace()}")  # すべて空白文字か
print(f"'Hello World'.istitle(): {'Hello World'.istitle()}")  # タイトルケースか

実行結果:

'123'.isdigit(): True
'abc'.isalpha(): True
'123abc'.isalnum(): True
'HELLO'.isupper(): True
'hello'.islower(): True
'   '.isspace(): True
'Hello World'.istitle(): True

これらのメソッドは、文字列が特定の条件を満たすかどうかをチェックし、結果を真偽値(TrueまたはFalse)で返します。

文字列フォーマットメソッド#

文字列内に値を埋め込むためのformat()メソッドもあります。

>
# format()メソッド
template = "こんにちは、{}さん。あなたは{}歳です。"
formatted = template.format("田中", 25)
print(formatted)

# 名前付きプレースホルダ
template3 = "{name}{age}歳で、{job}として働いています。"
formatted3 = template3.format(name="佐藤", age=28, job="エンジニア")
print(formatted3)

実行結果:

こんにちは、田中さん。あなたは25歳です。
佐藤は28歳で、エンジニアとして働いています。

format()メソッドはf-stringと同様に、文字列内の{}(プレースホルダ)に値を埋め込みます。名前を使って、どの値をどのプレースホルダに埋め込むかを制御することもできます。

実践例:文字列メソッドを組み合わせる#

これまでに学んだメソッドを組み合わせることで、より複雑な文字列処理を行うことができます。実践例を見てみましょう。

例1:ユーザー入力のクリーニング#

ウェブフォームなどでユーザーからの入力を受け取る場合、余分な空白を削除したり、書式を統一したりする処理がよく行われます。これをまとめて「入力クリーニング」と呼びます。

>
user_input = " john  smith "

# 先頭と末尾の空白を削除
cleaned_input = user_input.strip()

# 連続した空白を1つに置換
cleaned_input = " ".join(cleaned_input.split())

# 先頭の文字を大文字に変換
cleaned_input = cleaned_input.title()

print(f"元の入力: '{input_text}'")
print(f"クリーニング後: '{cleaned_input}'")

実行結果:

元の入力: ' john  smith '
クリーニング後: 'John Smith'

このように、複数の文字列メソッドを組み合わせることで、実用的な処理を簡潔に記述できます。

例2:文字列の置換とフォーマット#

>
# テンプレートを使った文書生成
template = """
件名: {subject}

{recipient}
お世話になっております。{sender}です。

{message}

よろしくお願いいたします。

---
{sender}
{contact}
""".strip()

# テンプレートに値を埋め込む
email_body = template.format(
    subject="会議のお知らせ",
    recipient="山田太郎",
    sender="佐藤花子",
    message="来週の水曜日14時に会議を開催いたします。ご参加をお願いいたします。",
    contact="email: hanako@example.com"
)

print(email_body)

実行結果:

件名: 会議のお知らせ

山田太郎様

お世話になっております。佐藤花子です。

来週の水曜日14時に会議を開催いたします。ご参加をお願いいたします。

よろしくお願いいたします。

---
佐藤花子
email: hanako@example.com

文字列メソッドの特性#

文字列メソッドを使う際に覚えておくべきいくつかの重要な特性があります。

  1. 元の文字列は変更されない:メソッドを呼び出しても元の文字列は変更されず、新しい文字列が返されます。
>
# 元の文字列は変更されない
original = "hello"
uppercase = original.upper()
print(f"元の文字列: {original}")  # hello
print(f"新しい文字列: {uppercase}")  # HELLO

実行結果:

元の文字列: hello
新しい文字列: HELLO
  1. メソッドはチェーン可能:複数のメソッドを続けて呼び出すことができます。これを「メソッドチェーン」と呼びます。
>
# メソッドチェーン
text = "  HELLO, WORLD!  "
result = text.strip().lower().replace("world", "python")
print(f"元の文字列: '{text}'")
print(f"処理後: '{result}'")

実行結果:

元の文字列: '  HELLO, WORLD!  '
処理後: 'hello, python!'
  1. 日本語にも対応:ほとんどの文字列メソッドは日本語を含む文字列にも対応しています。
>
# 日本語の文字列メソッド
japanese = "こんにちは、世界!"
print(f"replace('世界', 'Python'): {japanese.replace('世界', 'Python')}")
print(f"upper(): {japanese.upper()}")  # ただし、日本語は大文字小文字変換しても変化しません

実行結果:

replace('世界', 'Python'): こんにちは、Python!
upper(): こんにちは、世界!

まとめ#

この記事では、Pythonの文字列メソッドについて学びました。

  • 大文字・小文字変換upper(), lower(), capitalize(), title()
  • 検索find(), rfind(), startswith(), endswith()
  • 置換replace()
  • 分割・結合split(), join()
  • 空白除去strip(), lstrip(), rstrip()
  • フォーマットformat()メソッド

文字列メソッドを使いこなせるようになると、テキスト処理が格段に効率的になります。実際のプログラミングでは、これらのメソッドを組み合わせて使うことが多いので、少しずつ慣れていきましょう。

日常的なプログラミングでよく使うメソッドから始めて、徐々に他のメソッドも覚えていくと良いでしょう。特にstrip(), replace(), split(), join()は頻繁に使われるメソッドなので、まずはこれらの使い方に慣れてみてください。