この記事を書くきっかけ
プログラミングの問題には「文字列の処理」というカテゴリーが存在します。例えば、「大文字を小文字にさせる問題」や「文字列を書き換える問題」、「文字列の中に、ある文字列が含まれているかどうか判定する問題」などです。
私の勝手なイメージですが、「文字列の処理」カテゴリーには「あのメソッドを使えば解けるのはわかるけど、普段全然使わないから書き方忘れた!解けない!」というような問題が多い気がします。忘れるたびにいちいち調べなきゃいけないので、地味にイラッとします。
そこで、文字列を操作するメソッドを一覧にしてみました。「文字列を〇〇したい」と思ったときに、「〇〇メソッドを使えばいい!」と思い出せるように、目的別に並べました。自分用に書いたところもあるので、かなり簡易的な説明となっていますが、よければ参考にしてみてください。
記事構成
- 文字列に対してしたいこと
- メソッド
- 使用例
メソッドとは
メソッドとは特定のデータ型(オブジェクト)に関連付けられた関数です。メソッドは、そのデータ型のオブジェクトに対してのみ適用でき、オブジェクト名にドット(.)を付けて呼び出されます。
オブジェクト名.メソッド名
今回は文字列型のメソッドで、個人的に一度は見たことがあるメソッドに限定して書いています。
1. 文字列の変換・操作
str
は文字列(string)を表しています。
文字列の最初の文字を大文字に変換したい
メソッド:str.capitalize()
print("hello".capitalize()) # "Hello"
capitalize
には「〜を大文字で始める」という意味があります。
文字列を小文字に変換したい
メソッド:str.lower()
print("HELLO".lower()) # "hello"
文字列を大文字に変換したい
メソッド:str.upper()
print("hello".upper()) # "HELLO"
各単語の最初の文字を大文字に変換したい
メソッド:str.title()
print("hello world".title()) # "Hello World"
2. 文字列の整形
width
は全体の幅、fillchar
には埋める文字(省略可能)を入れる。
文字列を指定した幅に中央寄せし、必要に応じて指定した文字で埋めたい
メソッド:str.center(width[, fillchar])
print("hello".center(10, '-')) # "--hello---"
文字列を指定した幅に左寄せし、必要に応じて指定した文字で埋めたい
メソッド:str.ljust(width[, fillchar])
print("hello".ljust(10, '-')) # "hello-----"
文字列を指定した幅に右寄せし、必要に応じて指定した文字で埋めたい
メソッド:str.rjust(width[, fillchar])
print("hello".rjust(10, '-')) # "-----hello"
3. 部分文字列の検索
sub
は検索する部分文字列(substring)、start
とend
は検索の開始位置と終了位置(省略可能)です。
部分文字列が最初に出現する位置を知りたい
メソッド:str.find(sub[, start[, end]])
見つからない場合は-1を返します。
print("hello".find("e")) # 1
部分文字列が最後に出現する位置を知りたい
メソッド:str.rfind(sub[, start[, end]])
見つからない場合は-1を返します。
print("hello world".rfind("o")) # 7
部分文字列が最初に出現する位置を知りたい
メソッド:str.index(sub[, start[, end]])
見つからない場合はValueErrorを発生させます。
print("hello".index("e")) # 1
部分文字列が最後に出現する位置を知りたい
メソッド:str.rindex(sub[, start[, end]])
見つからない場合はValueErrorを発生させます。
print("hello world".rindex("l")) # 9
4. 部分文字列のチェック
start
とend
はチェックの開始位置と終了位置(省略可能)です。
文字列が指定した接頭辞で始まるかどうかをチェックしたい
メソッド:str.startswith(prefix[, start[, end]])
prefix
は接頭辞(文字の始まり)です。
print("hello".startswith("he")) # True
文字列が指定した接尾辞で終わるかどうかをチェックしたい
メソッド:str.endswith(suffix[, start[, end]])
suffix
は接尾辞(文字の終わり)です。
print("hello".endswith("o")) # True
部分文字列が文字列内に出現する回数をカウントしたい
メソッド:str.count(sub[, start[, end]])
sub
は検索する部分文字列(substring)のことです。
print("hello world".count("o")) # 2
5-1. 文字列の置換
old
は置換される文字列、new
は新しい文字列、count
は置換する回数(省略可能)です。
文字列の指定した部分を新しい文字列に置き換えしたい
メソッド:str.replace(old, new[, count])
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])
print(" hello ".strip()) # "hello"
文字列の先頭から指定した文字を削除したい
メソッド:str.lstrip([chars])
print(" hello".lstrip()) # "hello"
文字列の末尾から指定した文字を削除したい
メソッド:str.rstrip([chars])
print("hello ".rstrip()) # "hello"
6-1. 文字列の分割
sep
は区切り文字(省略可能)、maxsplit
は分割する最大回数(省略可能)。
sep
を省略した場合、空白文字(スペース、タブ、改行など)を区切り文字として使用します。連続する空白文字は一つの区切りと見なされます。
maxsplit=-1
の場合、分割回数に制限はありません。すべての区切り文字で分割されます。
文字列を指定した区切り文字で分割したい
メソッド:str.split(sep=None, maxsplit=-1)
print("hello world".split()) # ["hello", "world"]
sep
を指定した場合、その文字列で分割します。
maxsplit
を指定した場合、その回数だけ分割を行います。
文字列を右から指定した区切り文字で分割したい
メソッド:str.rsplit(sep=None, maxsplit=-1)
print("one, two, three".rsplit(", ", 1)) # ["one, two", "three"]
改行文字で分割したい
keepends
は改行文字を含めるかどうかを指定します(省略可能)。
メソッド:str.splitlines([keepends])
# デフォルトの動作(改行文字を含めない)
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)
print("".join(["a", "b", "c"])) # "abc"
print(",".join(["a", "b", "c"])) # "a,b,c"
7. 文字列の判定
文字列が英数字で構成されているかどうかをチェックしたい
メソッド:str.isalnum()
print("hello123".isalnum()) # True
文字列がアルファベットだけで構成されているかどうかをチェックしたい
メソッド:str.isalpha()
print("hello".isalpha()) # True
文字列が数字だけで構成されているかどうかをチェックしたい
メソッド:str.isdigit()
print("123".isdigit()) # True
文字列が小文字だけで構成されているかどうかをチェックしたい
メソッド:str.islower()
print("hello".islower()) # True
文字列が大文字だけで構成されているかどうかをチェックしたい
メソッド:str.isupper()
print("HELLO".isupper()) # True
文字列が空白文字だけで構成されているかどうかをチェックしたい
メソッド:str.isspace()
print(" ".isspace()) # True
文字列がタイトルケース(各単語の最初の文字が大文字)であるかどうかをチェックしたい
メソッド:str.istitle()
print("Hello World".istitle()) # True
8. その他
文字列を指定したエンコーディングでエンコードしたい
メソッド:str.encode(encoding='utf-8', errors='strict')
print("hello".encode("utf-8")) # b'hello'
encoding
のデフォルトは'utf-8'です。他の一般的なエンコーディング方式には 'ascii', 'latin-1', 'utf-16' などがあります。
errors
は省略可能です。エンコード時にエラーが発生した場合の処理方法を指定します。
デフォルトは 'strict'です。
オプション
- strict: エンコードエラーが発生した場合に UnicodeEncodeError を発生させます(デフォルト)
- ignore: エンコードエラーを無視
- replace: エンコードできない文字を「 ? 」に置き換える
- xmlcharrefreplace: XML文字参照でエンコードできない文字を置き換える(例: Ӓ)
- backslashreplace: バックスラッシュエスケープシーケンスでエンコードできない文字を置き換える(例: \u1234)
文字列のフォーマットを行いたい
プレースホルダー {} を含む文字列に引数を埋め込むことができます。
メソッド:str.format(*args, **kwargs)
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(引数)」の略です。
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(キーワード引数)」の略です。
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
まとめ
文字列を操作するメソッドを列挙しました。今回初めて知ったメソッドもあります。書き方を忘れたら、この記事を読み直したいと思います。