Pythonで文字列を操作するメソッド一覧

# この記事を書くきっかけ
プログラミングの問題には「文字列の処理」というカテゴリーが存在します。例えば、「大文字を小文字にさせる問題」や「文字列を書き換える問題」、「文字列の中に、ある文字列が含まれているかどうか判定する問題」などです。

私の勝手なイメージですが、「文字列の処理」カテゴリーには「あのメソッドを使えば解けるのはわかるけど、普段全然使わないから書き方忘れた！解けない！」というような問題が多い気がします。忘れるたびにいちいち調べなきゃいけないので、地味にイラッとします。

そこで、文字列を操作するメソッドを一覧にしてみました。「文字列を〇〇したい」と思ったときに、「〇〇メソッドを使えばいい！」と思い出せるように、目的別に並べました。自分用に書いたところもあるので、かなり簡易的な説明となっていますが、よければ参考にしてみてください。

**記事構成**
- 文字列に対してしたいこと
- メソッド
- 使用例


# メソッドとは
メソッドとは特定のデータ型（オブジェクト）に関連付けられた関数です。メソッドは、そのデータ型のオブジェクトに対してのみ適用でき、オブジェクト名にドット（.）を付けて呼び出されます。

`オブジェクト名.メソッド名`

今回は文字列型のメソッドで、個人的に一度は見たことがあるメソッドに限定して書いています。
# 1. 文字列の変換・操作
`str` は文字列（string）を表しています。
### 文字列の最初の文字を大文字に変換したい
メソッド：`str.capitalize()`
```python
print("hello".capitalize())  # "Hello"
```
`capitalize`には「〜を大文字で始める」という意味があります。
### 文字列を小文字に変換したい
メソッド：`str.lower()` 
```python
print("HELLO".lower())  # "hello"
```
### 文字列を大文字に変換したい
メソッド：`str.upper()`
```python
print("hello".upper())  # "HELLO"
```
### 各単語の最初の文字を大文字に変換したい
メソッド：`str.title()`
```python
print("hello world".title())  # "Hello World"
```
# 2. 文字列の整形
`width`は全体の幅、`fillchar`には埋める文字（省略可能）を入れる。
### 文字列を指定した幅に中央寄せし、必要に応じて指定した文字で埋めたい
メソッド：`str.center(width[, fillchar])` 
```python
print("hello".center(10, '-'))  # "--hello---"
```
### 文字列を指定した幅に左寄せし、必要に応じて指定した文字で埋めたい
メソッド：`str.ljust(width[, fillchar])` 
```python
print("hello".ljust(10, '-'))  # "hello-----"
```
### 文字列を指定した幅に右寄せし、必要に応じて指定した文字で埋めたい
メソッド：`str.rjust(width[, fillchar])` 
```python
print("hello".rjust(10, '-'))  # "-----hello"
```
# 3. 部分文字列の検索
`sub`は検索する部分文字列（substring）、`start`と`end`は検索の開始位置と終了位置（省略可能）です。
### 部分文字列が最初に出現する位置を知りたい
メソッド：`str.find(sub[, start[, end]])` 
見つからない場合は-1を返します。
```python
print("hello".find("e"))  # 1
```
### 部分文字列が最後に出現する位置を知りたい
メソッド：`str.rfind(sub[, start[, end]])` 
見つからない場合は-1を返します。
```python
print("hello world".rfind("o"))  # 7
```
### 部分文字列が最初に出現する位置を知りたい
メソッド：`str.index(sub[, start[, end]])` 
見つからない場合はValueErrorを発生させます。
```python
print("hello".index("e"))  # 1
```
### 部分文字列が最後に出現する位置を知りたい
メソッド：`str.rindex(sub[, start[, end]])`
見つからない場合はValueErrorを発生させます。
```python
print("hello world".rindex("l"))  # 9
```
# 4. 部分文字列のチェック
`start`と`end`はチェックの開始位置と終了位置（省略可能）です。
### 文字列が指定した接頭辞で始まるかどうかをチェックしたい
メソッド：`str.startswith(prefix[, start[, end]])`
`prefix`は接頭辞（文字の始まり）です。
```python
print("hello".startswith("he"))  # True
```
### 文字列が指定した接尾辞で終わるかどうかをチェックしたい
メソッド：`str.endswith(suffix[, start[, end]])`
`suffix`は接尾辞（文字の終わり）です。
```python
print("hello".endswith("o"))  # True
```
### 部分文字列が文字列内に出現する回数をカウントしたい
メソッド：`str.count(sub[, start[, end]])`
`sub`は検索する部分文字列（substring）のことです。
```python
print("hello world".count("o"))  # 2
```
# 5-1. 文字列の置換
`old`は置換される文字列、`new`は新しい文字列、`count`は置換する回数（省略可能）です。
### 文字列の指定した部分を新しい文字列に置き換えしたい
メソッド：`str.replace(old, new[, count])` 
```python
print("hello world".replace("world", "Python"))  # "hello Python"
```
# 5-2.文字列の削除
`chars`は削除する文字（省略可能）です。
`str.strip()`、`str.lstrip()`、`str.rstrip()`メソッドの引数`chars`を省略した場合、
デフォルトで空白文字（スペース、タブ、改行など）が削除対象となります。
- スペース（ ）
- タブ（\t）
- 改行（\n）
- 復帰（\r）
- 垂直タブ（\v）
- フォームフィード（\f）
### 文字列の先頭と末尾から指定した文字を削除したい
メソッド：`str.strip([chars])` 

```python
print("   hello   ".strip())  # "hello"
```
### 文字列の先頭から指定した文字を削除したい
メソッド：`str.lstrip([chars])` 
```python
print("   hello".lstrip())  # "hello"
```
### 文字列の末尾から指定した文字を削除したい
メソッド：`str.rstrip([chars])`
```python
print("hello   ".rstrip())  # "hello"
```
# 6-1. 文字列の分割
`sep`は区切り文字（省略可能）、`maxsplit`は分割する最大回数（省略可能）。

`sep`を省略した場合、空白文字（スペース、タブ、改行など）を区切り文字として使用します。連続する空白文字は一つの区切りと見なされます。
`maxsplit=-1` の場合、分割回数に制限はありません。すべての区切り文字で分割されます。

### 文字列を指定した区切り文字で分割したい
メソッド：`str.split(sep=None, maxsplit=-1)`
```python
print("hello world".split())  # ["hello", "world"]
```
`sep` を指定した場合、その文字列で分割します。
`maxsplit` を指定した場合、その回数だけ分割を行います。
### 文字列を右から指定した区切り文字で分割したい
メソッド：`str.rsplit(sep=None, maxsplit=-1)` 
```python
print("one, two, three".rsplit(", ", 1))  # ["one, two", "three"]
```
### 改行文字で分割したい
`keepends`は改行文字を含めるかどうかを指定します（省略可能）。

メソッド：`str.splitlines([keepends])` 
```python
# デフォルトの動作（改行文字を含めない）
text = "Line1\nLine2\nLine3\n"
result = text.splitlines()
print(result)  # ["Line1", "Line2", "Line3"]

# keepends=True の場合（改行文字を含める）
text = "Line1\nLine2\nLine3\n"
result = text.splitlines(True)
print(result)  # ["Line1\n", "Line2\n", "Line3\n"]
```
# 6-2. 文字列の結合
`iterable`は結合する要素のイテラブル。リスト、タプル、セット、辞書のキー、ジェネレータなどに使用できます。
### イテラブルの各要素を文字列として結合したい
メソッド：`str.join(iterable)`
```python
print("".join(["a", "b", "c"]))  # "abc"
print(",".join(["a", "b", "c"]))  # "a,b,c"
```
# 7. 文字列の判定
### 文字列が英数字で構成されているかどうかをチェックしたい
メソッド：`str.isalnum()` 
```python
print("hello123".isalnum())  # True
```
### 文字列がアルファベットだけで構成されているかどうかをチェックしたい
メソッド：`str.isalpha()`
```python
print("hello".isalpha())  # True
```
### 文字列が数字だけで構成されているかどうかをチェックしたい
メソッド：`str.isdigit()` 
```python
print("123".isdigit())  # True
```
### 文字列が小文字だけで構成されているかどうかをチェックしたい
メソッド：`str.islower()` 
```python
print("hello".islower())  # True
```
### 文字列が大文字だけで構成されているかどうかをチェックしたい
メソッド：`str.isupper()` 
```python
print("HELLO".isupper())  # True
```
### 文字列が空白文字だけで構成されているかどうかをチェックしたい
メソッド：`str.isspace()`
```python
print("   ".isspace())  # True
```
### 文字列がタイトルケース（各単語の最初の文字が大文字）であるかどうかをチェックしたい
メソッド：`str.istitle()`
```python
print("Hello World".istitle())  # True
```
# 8. その他
### 文字列を指定したエンコーディングでエンコードしたい
メソッド：`str.encode(encoding='utf-8', errors='strict')`
```python
print("hello".encode("utf-8"))  # b'hello'
```

`encoding`のデフォルトは'utf-8'です。他の一般的なエンコーディング方式には 'ascii', 'latin-1', 'utf-16' などがあります。

`errors`は省略可能です。エンコード時にエラーが発生した場合の処理方法を指定します。
デフォルトは 'strict'です。

**オプション**
- strict: エンコードエラーが発生した場合に UnicodeEncodeError を発生させます（デフォルト）
- ignore: エンコードエラーを無視
- replace: エンコードできない文字を「 ? 」に置き換える
- xmlcharrefreplace: XML文字参照でエンコードできない文字を置き換える（例: &#1234;）
- backslashreplace: バックスラッシュエスケープシーケンスでエンコードできない文字を置き換える（例: \u1234）

### 文字列のフォーマットを行いたい
プレースホルダー {} を含む文字列に引数を埋め込むことができます。

メソッド：`str.format(*args, **kwargs)`
```python
print("Hello, {}!".format("world"))  # "Hello, world!"

# 位置引数を使用した場合
text = "My name is {} and I am {} years old."
formatted_text = text.format("Taro", 15)
print(formatted_text)  # 出力: "My name is Taro and I am 15 years old."

# キーワード引数を使用した場合
text = "My name is {name} and I am {age} years old."
formatted_text = text.format(name="Jiro", age=10)
print(formatted_text)  # 出力: "My name is Jiro and I am 10 years old."
```
#### *args（位置引数）とkwargs（キーワード引数）
***args（位置引数）**
*args は、関数が任意の数の位置引数を受け取ることができるようにするための構文です。関数呼び出し時に渡された引数はタプルとして関数内で扱われます。
args は「arguments（引数）」の略です。
```python
def print_args(*args):
    for arg in args:
        print(arg)

print_args(1, 2, 3)  # 出力: 1, 2, 3
print_args("a", "b", "c")  # 出力: a, b, c
```
****kwargs（キーワード引数）**
**kwargs は、関数が任意の数のキーワード引数を受け取ることができるようにするための構文です。関数呼び出し時に渡されたキーワード引数は辞書として関数内で扱われます。
kwargs は「keyword arguments（キーワード引数）」の略です。

```python
def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_kwargs(name="Taro", age=15)  # 出力: name: Taro, age: 15
print_kwargs(country="Japan", city="Tokyo")  # 出力: country: Japan, city: Tokyo
```
# まとめ
文字列を操作するメソッドを列挙しました。今回初めて知ったメソッドもあります。書き方を忘れたら、この記事を読み直したいと思います。