文字列の操作は頻繁に行われます。 数字の操作よりもはるかに頻度が高いでしょう。
文字列操作には、演算子を使うものと、文字列のメソッドを使うものがあります。 それに加え、正規表現も多く使われますが、それは次回に回したいと思います。
文字列の演算子による操作
文字列の連結
+
演算子を使うと、複数の文字列を1つに連結できます。
Pythonを立ち上げ、対話的に使い、+演算子がどのように動作するか見てみましょう。
>>> h = "Hello" >>> w = "world" >>> s = h + " " + w + "." >>> s 'Hello world.' >>>
文字列の繰り返し
*
演算子を使うと、文字列を指定した回数だけ繰り返せます。
>>> h = "Hello" >>> s = h * 3 >>> s 'HelloHelloHello' >>>
文字列の比較
==
演算子で、2つの文字列が同じかどうかを判定できます。
>>> s = "apple" >>> t = "apple" >>> s == t True >>>
大文字と小文字は異なる文字として扱われます。
>>> "Apple" == "apple" False >>>
!=
は「等しくない」ことを判定します。
文字列が違えばTrue
、同じならばFalse
を返します。
<
, >
, <=
, >=
は、文字列の辞書順(アルファベット順)で比較する場合に使います。
この比較では1文字ずつ、その文字コードの大小で比べていきますので、大小比較は文字コードに依存します。
アルファベットの範囲で、ASCIIやUTF-8を使っているならば、
- 大文字は小文字よりも小さい
- 大文字同士、小文字同士ならば、アルファベットの前の文字が小さく、後ろの文字が大きいとなります。
>>> "apple" < "banana" True >>>
文字列の比較では==
と!=
が、他と比べ圧倒的に良く使われます。
不等式は文字列を辞書順に並べたい、ソートしたいとき以外はあまり使わないでしょう。
文字列が含まれているか確認するin 演算子
in
演算子で、ある文字列が別の文字列に含まれているかを調べられます。
含まれている場合はTrue
、含まれていない場合はFalse
を返します。
>>> s = "Hello world." >>> "world" in s True >>> "Python" in s False >>>
文字列のメソッド
メソッドとは、特定のオブジェクトの種類(後の記事で扱うが、これをクラスという)に定義されている操作です。
例えば、"abc"
や"def"
などは文字列で、文字列に定義されている操作がメソッドです。
メソッドは「オブジェクト.メソッド名(引数の列)」という形で呼び出されます。
例えば"abc".upper()
は文字列オブジェクトの"abc"
においてメソッドupper
を呼び出します。
このドットの前に書かれたオブジェクトをメソッドのレシーバといいます。
文字列オブジェクトはすべて同じメソッドを持っています。
関数とメソッドは似てますが、関数は特定のオブジェクトとの関連はありません。
文字列のメソッドには便利なものがたくさんあります。ここでは、よく使われるメソッドをいくつか紹介します。
split
レシーバの文字列を、引数で指定した区切り文字で分割し、リストを返します。 デフォルトの区切り文字は空白です。 「デフォルト」という言葉はこれまでもたびたび出てきましたが、特に指定がないときのものをいいます。 ですから、splitメソッドで引数がなければ、デフォルトの空白が区切り文字として使われます。
>>> s = "apple orange banana" >>> s.split() ['apple', 'orange', 'banana'] >>>
特定の区切り文字を指定した場合。
>>> s = "apple,orange,banana" >>> s.split(",") ['apple', 'orange', 'banana'] >>>
join
引数にリストをとり、その各要素を、レシーバ(区切り文字)で連結して、1つの文字列にします。
>>> t = ["apple", "orange", "banana"] >>> " ".join(t) 'apple orange banana' >>>
replace
文字列中の特定の文字や文字列を別のものに置き換えた新しい文字列を返します。
>>> s = "I like apples." >>> s.replace("apples", "bananas") 'I like bananas.' >>> s 'I like apples.' >>>
Pythonの文字列は不変なので、replaceメソッドがレシーバの文字列を変更することはありません。
常に新しく文字列を作り、それを返します。
元の文字列s
が変わっていないことからも、それが分かります。
strip
文字列の先頭と末尾から指定した文字を削除した新しい文字列を作り、それを返します。 デフォルトでは空白を削除します。
>>> s = " Hello world. " >>> s.strip() 'Hello world.' >>>
特定の文字を指定することもできます。
>>> s = "---Hello world.---" >>> s.strip("-") 'Hello world.' >>>
しかし、空白を取り除くことに使うことが多いでしょう。 前後の空白を取り除くことをトリミングともいいます。
find
指定した文字列が最初に見つかる位置を返します。見つからない場合は -1
を返します。
>>> s = "apple orange banana" >>> s.find("orange") 6 >>>
文字列中の位置は、最初の文字を0番目としてカウントします。 これは、リストの最初の要素が0番目であることと同じです。 人間は日常的に1から数え始めますが、コンピュータでは0から数え始める方が普通です。
in演算子とfindメソッドは文字列中の部分文字列に関する操作である点は似ていますが、使い方が違います。
- in演算子: 文字列中に部分文字列があるかないかの判断で使う
- findメソッド: 文字列中の部分文字列の位置を知りたいときに使う
この使い方を踏まえないと、理解しにくいプログラムになるので注意が必要です。
lowerとupper
文字列の中のアルファベットをすべて小文字または大文字に変換します。 アルファベット以外は変換されません。
>>> s = "Hello world." >>> s.upper() 'HELLO WORLD.' >>> s.lower() 'hello world.' >>> s 'Hello world.' >>>
繰り返しになりますが、文字列は不変なので、レシーバが変更されることはありません。 それは、6-7行目で、変数sによって表されている文字列オブジェクトが不変であることから確認できます。
startswithとendswith
文字列が特定の文字列で始まるか、終わるかをチェックして、True
または False
を返します。
>>> s = "Hello world." >>> s.startswith("Hello") True >>> s.endswith("world") False >>> s.endswith(".") True >>>
メソッド名がstartswithで、startwithではない(startの次にsがある)ことに注意してください。 これを間違えるとエラーになります。